ESA エッジノードで URL 書き換えルールを設定し、オリジンリクエスト時にリクエストパスとクエリ文字列を変更します。ユーザー向けの URL やフロントエンド設定を変更せずに、オリジンサーバーのパスを移行できます。
代表的なユースケース
-
オリジンの移行: オリジンのファイルパスが変更されても、ユーザーのアクセスパスを変更せずに維持できます。
-
APIバージョンの適応: 古い API バージョンのパスを新しいバージョンに書き換えます。
-
パラメーターの標準化: 異なるクライアントから渡されるパラメーター形式を統一します。
-
クリーンなURL: 複雑なバックエンドパスを、わかりやすいユーザー向けパスにマッピングします。
仕組み
URL 書き換えを有効にした場合、プリフェッチリクエストでは書き換え後の URL を使用する必要があります。
URL 書き換えはオリジンリクエスト時にのみ適用され、ESA 内部の処理パイプラインには影響しません。キャッシュキーは元の URL から生成されるため、キャッシュの一致には影響しません。書き換え後の URL は、オリジンリクエストにのみ使用されます。
実行フロー
-
キャッシュの確認: エッジノードは元の URL でキャッシュを検索します。キャッシュミスの場合、URL 書き換えルールによって URL がターゲットパスに変換されます。
-
オリジンリクエスト: 書き換え後の URL がオリジンサーバーに送信されます。レスポンスは、元の URL をキャッシュキーとしてキャッシュされます。
-
キャッシュコンテンツの返却: キャッシュされたコンテンツがクライアントに返されます。
実行順序
URL 書き換えは、キャッシュチェックとオリジン選択の後、オリジンリクエストヘッダーの変更の前に実行されます。オリジンターゲットが決定された後にパスが調整されるため、ヘッダー処理には影響しません。
URL 書き換えルールの設定
-
ESA コンソールでサイト管理 を選択し、サイト 列で対象サイトをクリックします。
-
左側メニューで、 を選択します。
-
URL の書き換え セクションで、ルールを追加 をクリックし、ルール名 を入力します。 パス と クエリ文字列 を設定し、OK をクリックします。
書き換え対象
操作方法
説明
例
[パス]
[保持する]
元のパスを変更しません。
-
[静的]
固定パスに置き換えます (/ で始まる必要があります)。
/new/path[動的]
式を使用してパスを動的に生成します。
concat("/v2", http.request.uri.path)[クエリ文字列]
[保持する]
元のクエリ文字列を変更しません。
-
[静的]
固定パラメーターに置き換えます (? は不要)。
version=new&type=api[動的]
式を使用してクエリ文字列を動的に生成します。
concat("version=new&", http.request.uri.query)
設定例
例 1:オリジンパスの移行
-
ユースケース: オリジンが画像を
/images/ディレクトリから/static/img/ディレクトリに移動します。 -
一致条件:
starts_with(http.request.uri.path, "/images/") -
書き換え設定:
書き換え対象:パス
操作方法:動的
式:
regex_replace(http.request.uri.path, "^/images/", "/static/img/") -
書き換え効果:
ユーザーリクエスト:
https://example.com/images/logo.pngオリジンリクエスト:
https://origin.com/static/img/logo.png
例 2:APIバージョンの適応
-
ユースケース: オリジンリクエスト時に、
/api/v1/からのリクエストを/api/v2/に書き換え、バージョン識別子を追加します。 -
一致条件:
starts_with(http.request.uri.path, "/api/v1/") -
書き換え設定:
書き換え対象:パス、クエリ文字列
操作方法:動的
パス書き換え式:
regex_replace(http.request.uri.path, "^/api/v1/", "/api/v2/")クエリ文字列書き換え式:
concat("api_version=v2&", http.request.uri.query) -
書き換え効果:
ユーザーリクエスト:
https://example.com/api/v1/users?limit=10オリジンリクエスト:
https://origin.com/api/v2/users?api_version=v2&limit=10
例 3:パラメーターの標準化
-
ユースケース: 異なるクライアントが異なるパラメーター名 (
useridやuidなど) を使用しています。これらを標準のuser_idに統一します。 -
一致条件:
http.request.uri.query contains "userid=" -
書き換え設定:
書き換え対象:クエリ文字列
操作方法:動的
式:
regex_replace(http.request.uri.query, "userid=", "user_id=") -
書き換え効果:
ユーザーリクエスト:
https://example.com/profile?userid=123オリジンリクエスト:
https://origin.com/profile?user_id=123
例 4:パスの正規化
ケース 1
-
ユースケース: 入力エラーによって発生した URL 内の余分なスラッシュ (
//など) を削除します。 -
注意:
regex_replace関数は、元の文字列内の一致する最初の部分のみを置換します。 -
一致条件:
http.request.uri.path contains "//" -
書き換え設定:
書き換え対象:パス
操作方法:動的
式:
regex_replace(http.request.uri.path, "//+", "/") -
書き換え効果:
ユーザーリクエスト:
https://example.com/path//to/resourceオリジンリクエスト:
https://origin.com/path/to/resource
ケース 2
-
ユースケース: 連続する複数のスラッシュを単一のスラッシュに統合します。例:
/path///download//image//user.jpg -
解決策: 複数の
regex_replace呼び出しをネストして、連続するスラッシュを段階的に置換します。 -
一致条件:
http.request.uri.path contains "//" -
書き換え設定:
-
書き換え対象: パス
-
操作方法: 動的
-
式:
regex_replace(regex_replace(regex_replace(http.request.uri.path, "//+", "/"), "//+", "/"), "//+", "/")
-
-
書き換え効果:
-
ユーザーリクエスト:
https://example.com/path///download//image//user.jpg -
オリジンリクエスト:
https://origin.com/path/download/image/user.jpg
-
例 5:すべてのクエリパラメーターの削除
-
ユースケース: 静的リソースからすべてのクエリパラメーターを削除します。例えば、
.cssで終わる URI からクエリ文字列を削除します。 -
一致条件:
ends_with(http.request.uri.path, ".css") -
書き換え設定:
書き換え対象:クエリ文字列
操作方法:動的
式:
regex_replace(http.request.uri.query, ".*", "") -
書き換え効果:
ユーザーリクエスト:
https://example.com/style.css?version=1.2.3オリジンリクエスト:
https://origin.com/style.css
例 6:動的パスの簡素化
-
ユースケース: パスから冗長な数字列を削除します。例えば、
/example/配下のパスから123に続く数字を削除します。 -
一致条件:
(http.request.uri.path matches "^/example/(.*)123[0-9]+(.*)$") -
書き換え設定:
書き換え対象:パス
操作方法:動的
式:
regex_replace(http.request.uri.path,"^/example/(.*)123[0-9]+(.*)$","/example/$1$2") -
書き換え効果:
ユーザーリクエスト:
https://example.com/example/tool12300341featuresオリジンリクエスト:
https://origin.com/example/toolfeatures
例 7:パスパラメーターの抽出とクエリ文字列への追加
-
ユースケース: 動的パスセグメントを抽出し、クエリパラメーターとして追加して、固定文字列に置き換えます。
元のURI:
/api/v1/dynamic_value/download?version=1&size=2書き換え後のURI:
/api/v1/fixed/download?version=1&size=2&token=dynamic_value -
一致条件: すべての受信リクエスト
-
書き換え設定:
書き換え対象:パス + クエリ文字列
操作方法:動的
パス書き換え式:
regex_replace(http.request.uri.path, "^/api/v1/(.*)/download$", "/api/v1/fixed/download")クエリ文字列書き換え式:
concat(http.request.uri.query,"&token=",regex_replace(http.request.uri.path, "^/api/v1/(.*)/download$","$1")) -
書き換え効果:
ユーザーリクエスト:
https://example.com/api/v1/ABC123/download?version=1&size=2オリジンリクエスト:
https://origin.com/api/v1/fixed/download?version=1&size=2&token=ABC123
例 8:特定のパラメーターの削除
-
ユースケース: 特定のクエリパラメーターを削除します。例えば、
https://example.com/1.txt?key1=value1&key2=value2&key3=value3&key4=value4&key5=value5&key6=value6の場合、key2、key3、key5、key6 を削除し、key1 と key4 のみを保持します。 -
一致条件: すべての受信リクエスト
-
書き換え設定:
書き換え対象:クエリ文字列
操作方法:動的
式:
regex_replace(regex_replace(regex_replace(regex_replace(http.request.uri.query, "(&?key2=[^&]*)", ""), "(&?key3=[^&]*)", ""), "(&?key5=[^&]*)", ""), "(&?key6=[^&]*)", "")説明ネストされた各
regex_replaceは 1 つのパラメーターを削除します。パターン(&?keyN=[^&]*)は、先行する&もマッチング対象とすることで、不要な&文字が残るのを防ぎます。 -
書き換え効果:
ユーザーリクエスト:
https://example.com/1.txt?key1=value1&key2=value2&key3=value3&key4=value4&key5=value5&key6=value6オリジンリクエスト:
https://origin.com/1.txt?key1=value1&key4=value4
例 9:特定のパラメーターの保持
-
ユースケース: 特定のクエリパラメーターのみを保持します。例えば、
https://example.com/1.txt?key1=value1&key2=value2&key3=value3&key4=value4の場合、key1 と key4 のみを保持します。 -
一致条件: すべての受信リクエスト
-
書き換え設定:
書き換え対象:クエリ文字列
操作方法:動的
式:
concat("key1=", http.request.uri.args["key1"], "&key4=", http.request.uri.args["key4"])説明concat関数は、指定されたパラメーターのみでクエリ文字列を再構築します。http.request.uri.args["keyN"]を使用して各パラメーター値を抽出します。指定されていないパラメーターは除外されます。 -
書き換え効果:
ユーザーリクエスト:
https://example.com/1.txt?key1=value1&key2=value2&key3=value3&key4=value4オリジンリクエスト:
https://origin.com/1.txt?key1=value1&key4=value4