Edge Security Acceleration (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
-
使用例:連続する複数のスラッシュを 1 つのスラッシュにまとめます。 例:
/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 matches "^/example/(.*)123[0-9]+(.*)$") -
書き換え設定:
書き換え対象:パス
操作方法:動的
式:
regex_replace(http.request.uri,"^/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