Location レスポンスヘッダ
リダイレクト先の URL が指定されます。
Location レスポンスヘッダーはリダイレクト先の URL を示します。 3xx (リダイレクト) または 201 (created) ステータスレスポンスを返すときのみ意味を成します。
リダイレクトの場合、 HTTP メソッドは元のメソッドとリダイレクトの種類によって、 Location で示されたページにアクセスする新しいリクエストを生成するために使用します。
ディレクティブ
<url>
(リクエスト URL からの) 相対 URL、または絶対 URL。
Transform Rules なしのリダイレクト通信フロー
例えば、example.com
ドメインで動くアプリ内で、絶対 URL としてリダイレクト先 http://redirect.dest.example.com/
を指定している場合、以下のようなフローになります。
- サーバーからの
Location
レスポンスヘッダhttp://...
をクライアントに返す - Cloudflare に
http://...
接続すると Always Use HTTPS によりhttps://...
としてリダイレクト - その後、クライアントブラウザからサーバーに
https://...
としてリクエストを開始
この場合、http://...
接続時にノーリファラーとなり、サイトによってはエラーになってしまう懸念があります。
ノーリファラーになる原因
⑦https→httpサイトへのアクセス
SSL(暗号化)に対応しているhttpsサイトから対応していないhttpのサイトにアクセスがあった場合、参照元の情報が渡されないため、ノーリファラーとなってしまいます。
ディレクティブ
strict-origin-when-cross-origin
(既定値)
同一オリジンのリクエストを行う際はオリジン、パス、クエリー文字列を送信します。オリジン間リクエストでは、プロトコルのセキュリティ水準が同じである場合 (HTTPS→HTTPS) にのみオリジンを送信します。安全性の低下する移動先 (HTTPS→HTTP) には Referer ヘッダーを送信しません。
Transform Rules ありのリダイレクト通信フロー
そのため、Transform Rules で Location
レスポンスヘッダのリダイレクト先 URL を http
から https
に書き換えることで、クライアントブラウザでは常に https
接続となり、ノーリファラーによるエラーを解消できます。
Transform Rules の設定例
例えば Transform Rules で HTTP Response Header Modification Rule を以下のように設定できます。
- If incoming requests match…
- Custom filter expression
- Response Status Code =
302
- Hostname =
302.example.com
- Response Status Code =
- Custom filter expression
- Then... Modify response header
Set dynamic
- Header name =
location
- Value =
regex_replace(http.response.headers["location"][0], "http://", "https://")
動作確認
以下の Workers を準備し、 Routes を 302.example.com
に紐付けて確認します。
export default {
async fetch(request, env, ctx) {
return new Response('Hello World!', {
status: 302,
headers: {
"location": "http://google.co.jp/",
},
});
},
};
以下のように Transform Rules で Location
レスポンスヘッダのリダイレクト先 URL を http
から https
に書き換えることができました。
# Transform Rules なし
% curl -sIXGET 'https://302.example.com/' | grep -i location
location: http://google.co.jp/
# Transform Rules あり
% curl -sIXGET 'https://302.example.com/' | grep -i location
location: https://google.co.jp/
まとめ
実際には、サイトやアプリのサーバー側で http://...
の絶対 URL 指定でリダイレクトを返さないように修正できれば、ベストです。
ただし、今回は Cloudflare Transform Rules を使えば、修正にかかるリソースや時間を避けて、通信の挙動を最適化することで、すぐにサイトやアプリを継続して使用可能な状態にできることを確認しました。
参考