はじめに
Webサイトを運用していると、URLの変更やページの移転に伴ってリダイレクトが必要になることがある。.htaccessやサーバー側の設定でリダイレクトを実装していたが、Cloudflareを使用している場合はリダイレクトルール機能を使うことで、サーバー側の設定を変更せずに簡単にリダイレクトを設定できる。
Cloudflareのリダイレクトルールには以下の利点がある
- リダイレクト処理がCloudflareのエッジで行われるため、オリジンサーバーに負荷がかからない
- エッジサーバーで処理されるため、応答速度が向上する
- URLパス、クエリパラメータ、ホスト名など様々な条件でリダイレクトを制御できる
- Cloudflareのダッシュボードから設定・変更が可能
今回は、実際にCloudflareのリダイレクトルールを使って、いくつかの基本的なリダイレクトパターンを試してみる。
環境
Cloudflare (Freeプラン)
独自ドメイン(Cloudflareで管理)Cloudflareリダイレクトルールとは
Cloudflareのリダイレクトルールは、特定の条件に一致するリクエストを別のURLにリダイレクトする機能である。
エッジサーバー(Cloudflareのネットワーク)でリダイレクト処理が行われるため、オリジンサーバーへのリクエストが発生しない。
リダイレクトルールの種類
Cloudflareでは主に以下の2種類のリダイレクトが利用できる
| 種類 | ステータスコード | 用途 | SEOへの影響 |
|---|---|---|---|
| 一時的なリダイレクト | 302 Found | 一時的なURL変更、メンテナンス時の別ページへの誘導 | 検索エンジンは元のURLを保持する |
| 恒久的なリダイレクト | 301 Moved Permanently | 恒久的なURL変更、サイトリニューアル | 検索エンジンは新しいURLにインデックスを移行する |
料金プラン別の制限
| プラン | リダイレクトルール数 | 月間リクエスト数 |
|---|---|---|
| Free | 10ルール | 制限なし |
| Pro | 25ルール | 制限なし |
| Business | 50ルール | 制限なし |
| Enterprise | カスタム | 制限なし |
- Redirects | Cloudflare Rules docs
https://developers.cloudflare.com/rules/url-forwarding/
実際にやってみる
Cloudflareダッシュボードにアクセス
Cloudflareダッシュボードにログイン

リダイレクトルールを設定したいドメインを選択

ルールを作成する
ルール → 概要 を選択する

ルールを作成 を選択する

リダイレクトルール を選択する

リダイレクトルールを作成する
リダイレクトルールの作成画面では、以下の項目を設定する
ルール名
ルールを識別するためのわかりやすい名前を付ける。
例: 旧ブログURLから新ブログURLへのリダイレクト条件(When incoming requests match…)
どのようなリクエストにリダイレクトを適用するかを定義する。
フィールド: リクエストのどの部分を評価するか
| フィールド | 説明 |
|---|---|
URI Path | URLのパス部分 |
URI Full | 完全なURL |
Hostname | ホスト名(ドメイン) |
URI Query String | クエリパラメータ |
| その他 | 多数のフィールドが利用可能 |
演算子: 条件の比較方法
| 演算子 | 説明 |
|---|---|
equals | 完全一致 |
contains | 含む |
matches regex | 正規表現でマッチ |
starts with | で始まる |
ends with | で終わる |
値: マッチさせる具体的な値
リダイレクト先の設定(Then…)
リダイレクト先のURLとステータスコードを設定する。
| 項目 | 説明 |
|---|---|
| Type | Dynamic(動的)またはStatic(静的) |
| URL | リダイレクト先のURL |
| Status code | 301(恒久的)または302(一時的) |
| Preserve query string | クエリパラメータを保持するかどうか |
設定した内容
今回は以下で設定した。
| 項目 | 設定値 |
|---|---|
| ルール名 | k-bushi.comからblog.k-bushi.comへのリダイレクト |
| 受信リクエストが一致する場合… | ワイルドカードパターン |
| リクエスト URL | https://k-bushi.com/blog |
| ターゲット URL | https://blog.k-bushi.com |
| ステータスコード | 301 |

確認
設定できていることを確認

curlで確認
curl -I https://k-bushi.com/blog ~ curl -I https://k-bushi.com/blog
HTTP/2 301
date: Sun, 02 Nov 2025 09:33:44 GMT
location: https://blog.k-bushi.com/
speculation-rules: "/cdn-cgi/speculation"
report-to: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=oBM2V61804vfhBpu0aBHHAADnRJ4ZfQKmyitSHKDtLnMBqz6OpdeUJGD7%2BYfe9qt%2BkeLXysiKWLR8Fbe%2Bc1nAttpt8YNoEIpnzlU"}]}
nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
server: cloudflare
cf-ray: 9982a1d24ac5f52f-NRTDynamic式について
Cloudflareのリダイレクトルールでは、Dynamic(動的)設定を使うことで柔軟なリダイレクトが可能になる。
よく使う関数一覧
| 関数 | 説明 | 使用例 |
|---|---|---|
concat() | 文字列を結合 | concat("https://", http.request.host) |
substring() | 部分文字列を取得 | substring(http.request.uri.path, 5) |
lower() | 小文字に変換 | lower(http.request.uri.path) |
upper() | 大文字に変換 | upper(http.request.uri.path) |
url_decode() | URLデコード | url_decode(http.request.uri.query) |
regex_replace() | 正規表現で置換 | regex_replace(http.request.uri.path, "^/old/", "/new/") |
よく使うフィールド
| フィールド | 説明 | 例 |
|---|---|---|
http.request.uri.path | URLパス | /blog/post-1 |
http.request.uri | 完全なURI | /blog/post-1?page=2 |
http.request.host | ホスト名 | example.com |
http.request.uri.query | クエリ文字列 | page=2&sort=date |
http.request.uri.query_string["key"] | 特定のクエリパラメータ | 2 |
テスト
設定したリダイレクトルールが正しく動作するか確認する。
1. ブラウザで確認
シンプルにブラウザでURLにアクセスして、リダイレクトされることを確認する。
注意点
- ブラウザのキャッシュをクリアしてからテスト
- プライベートモード(シークレットモード)での確認をする
2. curlコマンドで確認
ターミナルからHTTPヘッダーを確認する。
# リダイレクトを追跡せずヘッダーのみ表示
curl -I https://example.com/old-blog
# 期待される出力
HTTP/2 301
location: https://example.com/blog
cf-cache-status: DYNAMIC
server: cloudflare# リダイレクトを追跡して最終的な結果を確認
curl -L -I https://example.com/old-blog3. オンラインツールで確認
Redirect Checker
- URLを入力するだけでリダイレクトチェーンを確認できる
- ステータスコードやヘッダー情報も表示される
WhatsMyDNS
- 世界中のDNSサーバーから名前解決を確認できる
- Cloudflareの設定が反映されているか確認する
リダイレクトルールの優先順位
複数のリダイレクトルールを設定した場合、以下の優先順位で適用される
- リスト内での順序: 上にあるルールが優先
- 最初にマッチしたルール: 1つのルールがマッチすると、以降のルールは評価されない
優先順位の設定方法
ダッシュボードでルールをドラッグ&ドロップすることで順序を変更できる。 以下のようにするとよい。
- 最も具体的な条件のルール(完全一致など)
- 中程度の具体性のルール(前方一致など)
- 最も広範な条件のルール(すべてマッチなど)
例
1. URI Path equals /special-case → https://example.com/special
2. URI Path starts with /blog/ → https://example.com/posts/
3. Hostname equals old-domain.com → https://new-domain.comこの場合、/special-caseは1番目のルールでマッチするため、2番目のルールは適用されない。
注意するべきところ
1. リダイレクトループ
リダイレクト先が再度リダイレクトルールにマッチすると、無限ループが発生する。
NG例
ルール1: /old → /new
ルール2: /new → /old2. 301と302のリダイレクト
- 301(恒久的): URL構造の変更、サイトリニューアルなど永続的な変更
- 302(一時的): メンテナンス、A/Bテスト、限定ページなど一時的な変更
3. クエリパラメータの保持
Preserve query stringをONにしないと、クエリパラメータが失われる。
発生しうるトラブル
リダイレクトが動作しない
| 原因 | 解決方法 |
|---|---|
| Cloudflareのプロキシ(オレンジ雲)がOFFになっている | DNSレコードのプロキシをON(オレンジ雲)にする |
| ルールの条件が間違っている | 条件のフィールド、演算子、値を再確認 |
| キャッシュが残っている | ブラウザのキャッシュをクリア、またはCloudflareのキャッシュをパージ |
参考
Cloudflare Redirect Rules
https://developers.cloudflare.com/rules/url-forwarding/Cloudflare Rules Language
https://developers.cloudflare.com/ruleset-engine/rules-language/Cloudflare Dynamic Redirects
https://developers.cloudflare.com/rules/url-forwarding/bulk-redirects/concepts/#dynamic-redirectsHTTP Status Codes
https://developer.mozilla.org/ja/docs/Web/HTTP/Status301 vs 302 Redirects
https://moz.com/learn/seo/redirection
おわりに
Cloudflareのリダイレクトルール機能を使用することで、サーバー側の設定を変更することなくリダイレクトを実装できた。
エッジサーバーでリダイレクト処理が行われるため、オリジンサーバーへの負荷がかからず、応答速度も向上する。
また、ダッシュボードから直感的に設定できるため、.htaccessの複雑な記述や設定ファイルの編集が不要になる点もよい。
Freeプランでも10ルールまで設定できるため、個人サイトや小規模サイトであれば十分に活用できる。
URL構造の変更、ドメイン移転、HTTPSへの強制リダイレクトなど、様々なシーンで活用できるなと思った。
Dynamic式を使うことで、パスの一部を保持したり、クエリパラメータを変換したりといった高度なリダイレクトも実現できる。
今後必要なことがあれば使っていきたい。