Edge Security Acceleration (ESA) のエッジノードで URL リライトルールを設定することで、オリジンリクエストのパスとクエリ文字列を変更できます。ユーザー向けの URL やフロントエンドの設定を変更することなく、オリジンサーバーのパスを移行できます。
ユースケース
オリジンの移行:オリジンファイルのパスは調整されますが、ユーザーのアクセスパスは変更したくない場合。
API バージョンの適応:古い API バージョンのパスを新しいバージョンに書き換える場合。
パラメーターの標準化:異なるクライアントから渡されるパラメーターの形式を統一する場合。
クリーン URL:複雑なバックエンドパスを、分かりやすいユーザー向けのパスにマッピングする場合。
仕組み
お客様が送信したキャッシュプリフェッチタスクを ESA が実行する際、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.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"]を使用します。concat関数で指定されていないパラメーターは除外されます。書き換え効果:
ユーザーリクエスト:
https://example.com/1.txt?key1=value1&key2=value2&key3=value3&key4=value4オリジンリクエスト:
https://origin.com/1.txt?key1=value1&key4=value4
例 10:拡張子によるリクエストの除外と書き換え
ユースケース:拡張子が
htmlのリクエストを除外し、それ以外のすべてのリクエストを指定されたパスに書き換えます。一致条件:拡張子が
htmlと等しくない。式:http.request.uri.path.extension ne html書き換え設定:
書き換え対象:パス
操作方法:静的
書き換え後のパス:
/static/index.html
http.request.uri.path.extension 変数は、URI パス内の最も右側にあるファイルセグメントの拡張子を、先頭のドットを含まずに返します。たとえば、/cat.jpg の拡張子は jpg、/cat の拡張子は空文字列、/cat.html の拡張子は html です。
例 11:拡張子に基づくリクエストのルーティング
ユースケース:拡張子を持つリクエストを
static/urlにルーティングし、拡張子を持たないリクエストをstatic/index.htmlにルーティングします。一致条件と書き換え設定:
拡張子を持つリクエストには、一致条件
http.request.uri.path.extension ne ""を使用します。書き換え対象:パス
操作方法:静的
書き換え後のパス:
/static/url拡張子を持たないリクエストには、一致条件
http.request.uri.path.extension eq ""を使用します。書き換え対象:パス
操作方法:静的
書き換え後のパス:
/static/index.html