Apache mod_rewrite RewriteCondを活用した条件付きURLリライトの完全ガイド

Apacheのmod_rewriteモジュールは、柔軟かつ強力なURLリライト機能を提供することで知られています。その中でもRewriteCondディレクティブは、特定の条件を満たす場合にのみリライトを適用するための重要な役割を果たします。これにより、ユーザーエージェントの種類、アクセス元のIPアドレス、特定のクエリパラメータなど、さまざまな状況に応じたURL変換を行うことができます。

例えば、HTTPからHTTPSへのリダイレクトや、特定のディレクトリへのアクセス制限、モバイルユーザー専用サイトへのリダイレクトなど、多岐にわたるシナリオで利用されます。RewriteCondを正しく使うことで、サイトのセキュリティ強化やユーザー体験の向上が可能となります。

本記事では、mod_rewriteRewriteCondの基本的な使い方から、実践的な応用例までを幅広く解説します。初心者から中級者までを対象に、シンプルなリライトルールの記述方法から複雑な条件分岐までを段階的に学んでいきます。これにより、Apacheを使用するウェブサイトの管理者が、より効果的なURLリライトを実装できるようになります。

目次
  1. mod_rewriteとRewriteCondの概要
    1. RewriteCondの特徴
    2. RewriteCondの利用シーン
  2. RewriteCondの基本構文と使用例
    1. RewriteCondの構文の解説
    2. 基本的なRewriteCondの例
    3. RewriteCondを活用するメリット
  3. RewriteCondのフラグとその役割
    1. 主要なRewriteCondのフラグ一覧
    2. フラグの組み合わせ例
    3. フラグを活用するメリット
  4. 環境変数やHTTPヘッダーを使った条件付きリライト
    1. 環境変数を使ったRewriteCondの例
    2. HTTPヘッダーを使ったRewriteCondの例
    3. IPアドレスやホストを使ったRewriteCondの例
    4. リクエストメソッドを条件にしたリライト
    5. RewriteCondで環境変数を利用するメリット
  5. IPアドレスやリファラーでのアクセス制限例
    1. IPアドレスを使ったアクセス制限
    2. リファラーを使ったアクセス制限
    3. 特定のリファラーからのアクセスを特定ページにリダイレクト
    4. IPアドレスとリファラーを組み合わせたアクセス制限
    5. アクセス制限のメリット
  6. SSLの強制リダイレクトとRewriteCond
    1. RewriteCondを使ったHTTPSへの強制リダイレクト
    2. 特定ディレクトリだけをHTTPSにリダイレクト
    3. 逆にHTTPSをHTTPにリダイレクトする方法
    4. IPアドレスを条件にHTTPSリダイレクトを適用
    5. リダイレクトループを防ぐためのポイント
    6. HTTPS強制リダイレクトのメリット
  7. モバイルデバイス向けのURLリライト方法
    1. ユーザーエージェントを使ったモバイル判定
    2. モバイルデバイスを判定してリダイレクトする基本例
    3. モバイル以外のデバイスをPCサイトに戻す方法
    4. 特定ページのみモバイル向けにリダイレクト
    5. レスポンシブサイトへのリダイレクト回避
    6. キャッシュを考慮したリダイレクト例
    7. リダイレクトループを防ぐ方法
    8. モバイルリダイレクトのメリット
  8. RewriteCondを使ったトラブルシューティング
    1. 1. リダイレクトループの発生
    2. 2. リライトが適用されない
    3. 3. 特定の条件でリダイレクトが動作しない
    4. 4. 403 Forbidden エラーの発生
    5. 5. 正規表現のマッチングエラー
    6. トラブルシューティングのポイント
  9. まとめ

mod_rewriteとRewriteCondの概要


mod_rewriteはApache HTTPサーバーで使用されるモジュールで、URLの書き換えを行う機能を提供します。これにより、ユーザーがアクセスするURLを動的に変更し、より適切なリソースへ誘導したり、SEO対策やセキュリティ強化を行うことができます。

RewriteCondは、mod_rewriteのディレクティブの一つで、URLリライトの際に条件を指定する役割を持ちます。RewriteRuleだけでは、単純なパターンマッチングによるURLの変換しかできませんが、RewriteCondを使うことで、特定の状況でのみルールを適用するといった柔軟なリライトが可能となります。

RewriteCondの特徴

  • 条件付きリライト:指定した条件を満たす場合にのみURLのリライトを行うことができます。
  • 多様な条件指定:IPアドレス、リファラー、ユーザーエージェント、クエリパラメータ、HTTPヘッダーなど、多くの要素を条件として指定可能です。
  • 複数条件の組み合わせ:複数のRewriteCondを使って、AND条件を構成することができます。

RewriteCondの利用シーン

  • HTTPからHTTPSへのリダイレクト:セキュアな接続を強制するためのリダイレクト。
  • モバイルサイトへの誘導:ユーザーエージェントを判定してモバイル向けページにリライトする。
  • アクセス制限:特定のIPアドレスやリファラーを条件にしてページへのアクセスを制限する。
  • キャンペーンページへの誘導:特定のクエリパラメータを元に動的にキャンペーン用ページへリライトする。

これらの機能を理解することで、単なるURLの書き換えにとどまらず、サーバー管理やサイト運用の幅が広がります。次のセクションでは、RewriteCondの具体的な構文と使用例を詳しく解説します。

RewriteCondの基本構文と使用例


RewriteCondは、URLのリライトを行う前に特定の条件を設定するためのディレクティブです。基本的な書き方は以下の通りです。

RewriteCond 条件式 [フラグ]
RewriteRule パターン 変換先 [フラグ]

RewriteCondの構文の解説

  • 条件式:環境変数やサーバー変数、リクエストヘッダーなどを参照して条件を指定します。
  • パターン:RewriteRuleでリライト対象となるURLのパターンを指定します。
  • 変換先:一致したURLをどのように変換するかを記述します。
  • フラグ:条件やリライトの挙動を制御するためのオプションです。

基本的なRewriteCondの例

  1. HTTPからHTTPSへのリダイレクト
    HTTPアクセスを検出し、自動的にHTTPSにリダイレクトする設定です。
RewriteCond %{HTTPS} off  
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]  
  • %{HTTPS} offは、HTTPS接続ではない場合にルールを適用する条件です。
  • リダイレクトコード301は恒久的なリダイレクトを示します。
  • [L]は、処理をその場で終了することを意味します。
  1. 特定のリファラーを条件にしたアクセス制限
    特定の外部サイトからのアクセスをブロックします。
RewriteCond %{HTTP_REFERER} example.com  
RewriteRule ^.*$ - [F,L]  
  • %{HTTP_REFERER}はアクセス元のリファラーを判定します。
  • - [F]は403 Forbiddenエラーを返します。
  1. モバイルユーザーの自動リダイレクト
    モバイル端末からのアクセスを検出し、モバイル用サイトにリダイレクトします。
RewriteCond %{HTTP_USER_AGENT} (iPhone|Android)  
RewriteRule ^(.*)$ https://m.example.com/$1 [L,R=302]  
  • %{HTTP_USER_AGENT}を使い、ユーザーエージェントを判定します。
  • (iPhone|Android)でiPhoneまたはAndroidからのアクセスを対象とします。
  • 一時的なリダイレクトを意味する302を指定しています。

RewriteCondを活用するメリット

  • セキュリティ向上:HTTPSへの強制リダイレクトやアクセス制限が可能。
  • ユーザー体験の向上:モバイルユーザー向けページへの誘導が容易に。
  • 管理の柔軟性:複数の条件を組み合わせてリライトルールを細かく制御できます。

次のセクションでは、RewriteCondで使用される主要なフラグについて詳しく見ていきます。

RewriteCondのフラグとその役割


RewriteCondディレクティブでは、条件の評価方法や挙動を細かく制御するためにフラグを使用します。フラグはRewriteCondの条件式の後に記述され、リライトの適用条件をカスタマイズできます。ここでは、主要なRewriteCondのフラグとその役割を解説します。

主要なRewriteCondのフラグ一覧

  1. [NC] – 大文字小文字の区別を無効化
    条件式の比較で大文字と小文字を区別しないように設定します。

例:

RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
  • example.comEXAMPLE.COMの両方が一致します。
  1. [OR] – 複数条件のOR処理
    複数のRewriteCondを「または(OR)」で接続し、いずれかの条件を満たせばリライトが実行されます。

例:

RewriteCond %{HTTP_HOST} ^example\.com$ [NC,OR]
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ https://secure.example.com/$1 [L,R=301]
  • example.comまたはwww.example.comのいずれかに一致した場合、HTTPSにリダイレクトされます。
  1. [NV] – NULL値の無効化
    環境変数が存在しない場合に条件をfalseとして扱います。

例:

RewriteCond %{ENV:MY_VAR} ^$ [NV]
RewriteRule ^(.*)$ /error.html [L]
  • 環境変数MY_VARが存在しない場合にエラーページへ誘導します。
  1. [L] – 最終ルール
    条件が一致した時点で処理を終了し、それ以降のRewriteRuleが実行されません。

例:

RewriteCond %{REQUEST_URI} ^/admin [NC]
RewriteRule ^(.*)$ /maintenance.html [L]
  • /adminへのアクセスはすべてメンテナンスページへ誘導され、後続のリライトルールは無視されます。
  1. [R] – リダイレクト
    リライトではなくリダイレクトを行います。デフォルトでは302(Found)が使われますが、R=301のようにステータスコードを指定できます。

例:

RewriteCond %{REQUEST_URI} ^/old-page [NC]
RewriteRule ^(.*)$ /new-page [R=301,L]
  • /old-pageへのアクセスは301 Moved Permanently/new-pageにリダイレクトされます。

フラグの組み合わせ例


複数のフラグを組み合わせることで、さらに高度なリライトルールを作成できます。

例:

RewriteCond %{HTTP_HOST} ^example\.com$ [NC,OR]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
  • HTTPでアクセスされたexample.comwww.example.comへリダイレクトされます。

フラグを活用するメリット

  • 柔軟性の向上:複数の条件を組み合わせて複雑なリライトが可能。
  • パフォーマンスの最適化:不要なリライトルールを早期終了できる。
  • エラー回避:条件を細かく制御することで、リライトミスを防ぎます。

次は、環境変数やHTTPヘッダーを利用した条件付きリライトの設定について詳しく解説します。

環境変数やHTTPヘッダーを使った条件付きリライト


RewriteCondは、環境変数やHTTPヘッダーを利用して、アクセス元の状況に応じたURLリライトを実現します。これにより、特定のユーザーエージェントやリファラー、IPアドレスなどを条件としてURLを変換できるため、より柔軟なリダイレクトが可能になります。

環境変数を使ったRewriteCondの例


Apacheは、様々な環境変数を提供しており、これをRewriteCondで活用することができます。環境変数は %{ENV:変数名} の形式で参照します。

例1:特定の環境変数に基づいたリライト

RewriteCond %{ENV:MAINTENANCE_MODE} =on
RewriteRule ^(.*)$ /maintenance.html [L]
  • 環境変数MAINTENANCE_MODEonの場合、全てのアクセスをmaintenance.htmlに誘導します。

例2:サーバー環境に応じたリダイレクト

RewriteCond %{ENV:SERVER_ENV} staging
RewriteRule ^(.*)$ https://staging.example.com/$1 [L,R=302]
  • SERVER_ENVstagingのとき、リクエストをstaging.example.comにリダイレクトします。

HTTPヘッダーを使ったRewriteCondの例


HTTPヘッダーは %{HTTP_ヘッダー名} の形式で指定できます。これにより、アクセス元のリファラーやユーザーエージェントを条件として設定できます。

例3:特定のリファラーからのアクセスをブロック

RewriteCond %{HTTP_REFERER} example.com
RewriteRule ^(.*)$ - [F]
  • example.comからのアクセスを検出し、403 Forbiddenを返します。

例4:モバイルユーザーをモバイルサイトにリダイレクト

RewriteCond %{HTTP_USER_AGENT} (iPhone|Android)
RewriteRule ^(.*)$ https://m.example.com/$1 [L,R=302]
  • iPhoneやAndroidのユーザーエージェントを検出し、モバイルサイトにリダイレクトします。

IPアドレスやホストを使ったRewriteCondの例


IPアドレスやホストの条件指定は %{REMOTE_ADDR}%{REMOTE_HOST} を使います。

例5:特定のIPアドレスからのアクセスを許可

RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.
RewriteRule ^(.*)$ - [F]
  • 192.168.1.*以外のIPアドレスからのアクセスを拒否します。

例6:特定のホストからのアクセスをリダイレクト

RewriteCond %{REMOTE_HOST} ^customer.example.com$
RewriteRule ^(.*)$ /customer-portal.html [L]
  • customer.example.comからのアクセスをcustomer-portal.htmlにリダイレクトします。

リクエストメソッドを条件にしたリライト


リクエストメソッドは %{REQUEST_METHOD} で判定します。

例7:POSTリクエストをブロック

RewriteCond %{REQUEST_METHOD} POST
RewriteRule ^(.*)$ - [F]
  • POSTメソッドのリクエストを拒否します。

RewriteCondで環境変数を利用するメリット

  • カスタマイズ性の向上:環境やアクセス元に応じて柔軟にURLを変更できる。
  • セキュリティ強化:リファラーやIPアドレスを条件にすることで、不正アクセスを防止。
  • UX向上:デバイスに応じた最適なページを提供可能。

次のセクションでは、IPアドレスやリファラーを使ったアクセス制限について具体的な設定例を紹介します。

IPアドレスやリファラーでのアクセス制限例


RewriteCondは、特定のIPアドレスやリファラーに基づいてアクセスを制限する際に非常に有効です。これにより、不正アクセスの防止や、特定のユーザーグループへの限定公開などが可能になります。

IPアドレスを使ったアクセス制限


IPアドレスによるアクセス制限は、%{REMOTE_ADDR} を使用してリクエスト元のIPアドレスを判定します。

例1:特定のIPアドレスをブロックする

RewriteCond %{REMOTE_ADDR} ^203\.0\.113\.5$
RewriteRule ^(.*)$ - [F,L]
  • 203.0.113.5 からのアクセスを403 Forbiddenでブロックします。
  • [F] はForbiddenを返し、[L] はルールの処理を終了します。

例2:特定のIPレンジをブロックする

RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.
RewriteRule ^(.*)$ - [F,L]
  • 192.168.1.* の範囲に該当するIPアドレスからのアクセスを拒否します。
  • 正規表現を活用してIPレンジを指定できます。

例3:許可リスト方式でIPアドレスを制御

RewriteCond %{REMOTE_ADDR} !^203\.0\.113\.10$
RewriteCond %{REMOTE_ADDR} !^203\.0\.113\.11$
RewriteRule ^(.*)$ - [F,L]
  • 203.0.113.10203.0.113.11以外のIPアドレスからのアクセスはすべて拒否します。
  • 否定の ! を使うことで、指定されたIPアドレスだけが許可されます。

リファラーを使ったアクセス制限


リファラーとは、アクセス元のページを指し、%{HTTP_REFERER} で指定します。これを利用して、外部サイトからの直接リンクを制御できます。

例4:外部サイトからの直リンクを防ぐ

RewriteCond %{HTTP_REFERER} ^https?://(www\.)?example\.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [F,L]
  • example.com からの画像ファイルへの直リンクを防ぎます。
  • jpgpng などの画像ファイルが対象となります。

例5:特定のリファラー以外からのアクセスをブロック

RewriteCond %{HTTP_REFERER} !^https?://(www\.)?trusted-site\.com [NC]
RewriteRule ^.*$ - [F,L]
  • trusted-site.com 以外のリファラーからのアクセスはブロックされます。
  • 否定の ! を使用して条件を反転しています。

特定のリファラーからのアクセスを特定ページにリダイレクト

RewriteCond %{HTTP_REFERER} ^https?://promo\.example\.com [NC]
RewriteRule ^(.*)$ /special-offer.html [L,R=302]
  • promo.example.com からのアクセスは、自動的にspecial-offer.htmlにリダイレクトされます。
  • 一時的なリダイレクトの302を指定しています。

IPアドレスとリファラーを組み合わせたアクセス制限


複数のRewriteCondを組み合わせることで、より詳細なアクセス制御が可能です。

例6:特定のIPアドレスかつ特定のリファラーを条件にアクセスを許可

RewriteCond %{REMOTE_ADDR} ^203\.0\.113\.5$ [OR]
RewriteCond %{HTTP_REFERER} ^https?://trusted\.com [NC]
RewriteRule ^(.*)$ /dashboard.html [L]
  • 203.0.113.5からのアクセス、またはtrusted.comからのリファラーが条件を満たした場合にのみdashboard.htmlにリダイレクトされます。

アクセス制限のメリット

  • セキュリティの向上:不正アクセスや直リンクを防ぎ、ウェブサイトを保護します。
  • サーバー負荷の軽減:不要なトラフィックを制限することで、サーバーのリソース消費を抑えます。
  • 限定公開の実現:特定のIPアドレスやリファラーを条件として、限定的なページを提供できます。

次のセクションでは、HTTPSの強制リダイレクトを実現するRewriteCondの設定方法について解説します。

SSLの強制リダイレクトとRewriteCond


Webサイトのセキュリティ強化のために、HTTPからHTTPSへのリダイレクトは重要な施策です。これにより、データ通信が暗号化され、ユーザーのプライバシー保護やSEOの向上につながります。Apacheのmod_rewriteとRewriteCondを使うことで、簡単にHTTPアクセスをHTTPSにリダイレクトできます。

RewriteCondを使ったHTTPSへの強制リダイレクト


RewriteCondでは、%{HTTPS} 変数を使用してHTTPとHTTPSの状態を判定します。offであればHTTP接続であることを意味します。

基本例:HTTPをHTTPSにリダイレクト

RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  • %{HTTPS} off:HTTP接続である場合に条件が適用されます。
  • R=301:恒久的なリダイレクト(301 Moved Permanently)を指定しています。
  • %{HTTP_HOST}:現在のホスト名を維持したままリダイレクトします。
  • %{REQUEST_URI}:現在のパスとクエリをそのまま引き継ぎます。

特定ディレクトリだけをHTTPSにリダイレクト


全体ではなく、特定のディレクトリやページのみHTTPSを強制することも可能です。

例:/secureディレクトリ以下をHTTPSにリダイレクト

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/secure
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  • /secureディレクトリ以下のアクセスに対してのみHTTPSが強制されます。

逆にHTTPSをHTTPにリダイレクトする方法


場合によっては、特定のエリアでHTTPSを使用せずHTTPにリダイレクトしたいケースもあります。これは、%{HTTPS} が on の場合にHTTPへ戻すことで実現します。

例:/publicディレクトリはHTTPにリダイレクト

RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} ^/public
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  • /publicへのアクセスはHTTPに強制的に戻されます。

IPアドレスを条件にHTTPSリダイレクトを適用


管理者のIPアドレスからのアクセスだけをHTTPSにリダイレクトするなど、IPアドレスと組み合わせた条件付きリダイレクトも可能です。

例:管理者IPからのみHTTPSを強制

RewriteCond %{REMOTE_ADDR} ^203\.0\.113\.5$
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  • 203.0.113.5 からのアクセス時に限りHTTPSが強制されます。

リダイレクトループを防ぐためのポイント


リダイレクトループは、すでにHTTPSの状態で再度リダイレクトされることで発生します。これを防ぐには、HTTPSの状態を適切に判定することが重要です。

  • 正しい条件の記述:RewriteCondで %{HTTPS} off を適切に使用することで、ループを回避します。
  • ヘッダーの活用:クラウドプロキシなどを使用している場合、X-Forwarded-Proto ヘッダーを利用するのが有効です。

例:X-Forwarded-Protoを使ったリダイレクト

RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  • プロキシ経由でのリクエストに対しても、HTTPSが強制されます。

HTTPS強制リダイレクトのメリット

  • セキュリティ強化:データ通信が暗号化され、中間者攻撃(MITM)を防止します。
  • SEOの向上:GoogleはHTTPSサイトを優遇するため、検索ランキングの向上が期待できます。
  • ユーザー信頼性:HTTPSはブラウザで「保護された通信」と表示され、訪問者の安心感が高まります。

次のセクションでは、RewriteCondを利用したモバイルデバイス向けのURLリライト方法について解説します。

モバイルデバイス向けのURLリライト方法


モバイルユーザーが増加する中で、PC用サイトとモバイル用サイトを分けて運用するケースが増えています。Apacheのmod_rewriteを使えば、ユーザーのデバイスを検出し、自動的にモバイル向けのページにリダイレクトできます。これにより、ユーザー体験の向上とサイトの最適化が図れます。

ユーザーエージェントを使ったモバイル判定


ユーザーエージェント(User-Agent)とは、ブラウザやデバイスの情報を示すHTTPヘッダーです。Apacheでは %{HTTP_USER_AGENT} を使ってリクエスト元のデバイスを判別します。

モバイルデバイスを判定してリダイレクトする基本例


以下の例では、iPhoneやAndroidデバイスからのアクセスを検出し、モバイル専用サイトへリダイレクトします。

RewriteCond %{HTTP_USER_AGENT} (iPhone|Android) [NC]
RewriteRule ^(.*)$ https://m.example.com/$1 [L,R=302]
  • %{HTTP_USER_AGENT}:ユーザーエージェントを参照します。
  • (iPhone|Android):iPhoneまたはAndroidがユーザーエージェントに含まれる場合が対象です。
  • https://m.example.com/:モバイルサイトにリダイレクトします。
  • 302リダイレクト:一時的なリダイレクトを意味します。

モバイル以外のデバイスをPCサイトに戻す方法


モバイル専用サイトにアクセスしたPCユーザーを自動でPCサイトに戻すことも可能です。

RewriteCond %{HTTP_USER_AGENT} !(iPhone|Android) [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
  • モバイル以外のデバイスはPCサイトにリダイレクトされます。
  • 永続的なリダイレクトを意味する301を指定しています。

特定ページのみモバイル向けにリダイレクト


サイト全体ではなく、特定のページのみモバイルデバイス向けにリダイレクトしたい場合もあります。

RewriteCond %{HTTP_USER_AGENT} (iPhone|Android) [NC]
RewriteCond %{REQUEST_URI} ^/special-page
RewriteRule ^(.*)$ https://m.example.com/special-page [L,R=302]
  • /special-pageにアクセスがあった場合のみモバイルサイトへ誘導します。

レスポンシブサイトへのリダイレクト回避


レスポンシブデザインを採用しているサイトでは、URLリダイレクトを行わず、HTMLやCSSでデザインを切り替える方が効果的です。RewriteCondでリダイレクトする必要があるのは、PCサイトとモバイルサイトが完全に分かれている場合に限られます。

キャッシュを考慮したリダイレクト例


モバイルユーザーがPCサイトを見たい場合があるため、クッキーを使ってリダイレクトを回避する設定も可能です。

RewriteCond %{HTTP_USER_AGENT} (iPhone|Android) [NC]
RewriteCond %{HTTP_COOKIE} !skip_mobile=1
RewriteRule ^(.*)$ https://m.example.com/$1 [L,R=302]
  • skip_mobile=1というクッキーが存在する場合はリダイレクトを回避します。

リダイレクトループを防ぐ方法


モバイルサイトが既にm.example.comのように別ドメインやサブドメインで運用されている場合、ループが発生する可能性があります。
これを防ぐには、RewriteCondでモバイルサイトへのアクセスを除外する必要があります。

RewriteCond %{HTTP_USER_AGENT} (iPhone|Android) [NC]
RewriteCond %{HTTP_HOST} !^m\.example\.com$
RewriteRule ^(.*)$ https://m.example.com/$1 [L,R=302]
  • m.example.com へのアクセスはリダイレクトされません。

モバイルリダイレクトのメリット

  • ユーザー体験向上:デバイスに最適化されたページを表示できます。
  • 読み込み速度改善:モバイル専用ページを表示することで、PC向けページよりも軽量で高速な表示が可能になります。
  • SEO対策:モバイルサイトの有無は検索順位にも影響するため、最適化が求められます。

次のセクションでは、RewriteCondを使ったトラブルシューティングについて詳しく解説します。

RewriteCondを使ったトラブルシューティング


mod_rewriteを使用してURLリライトを行う際、意図した通りに動作しないケースが発生することがあります。RewriteCondの設定ミスや条件の誤りが原因で、リダイレクトループリライトが適用されないなどの問題が起こります。ここでは、よくあるトラブルの原因とその解決方法について解説します。

1. リダイレクトループの発生


症状
ブラウザで「このページはリダイレクトループにより表示できません」というエラーが表示されます。

原因
HTTPSリダイレクトやサブドメインへのリダイレクト条件が適切でない場合に発生します。

解決方法
現在のホスト名やプロトコルを判定し、リライト条件から除外することでループを防ぎます。

例1:HTTPSリダイレクトのループ回避

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} !^/secure
RewriteRule ^(.*)$ https://%{HTTP_HOST}/secure$1 [L,R=301]
  • HTTPSの状態を確認しつつ、すでに/secureへのアクセスはループしないように制御します。

例2:サブドメインのリダイレクトループ防止

RewriteCond %{HTTP_HOST} !^m\.example\.com$
RewriteRule ^(.*)$ https://m.example.com/$1 [L,R=301]
  • m.example.comへのリダイレクト時に、既にモバイルサイトにアクセスしている場合はループを避けます。

2. リライトが適用されない


症状
リダイレクトやリライトが適用されず、URLがそのまま表示されます。

原因

  • mod_rewriteモジュールが有効化されていない。
  • RewriteCondの条件が間違っている。
  • .htaccessの設定が無効化されている。

解決方法

  1. mod_rewriteが有効であることを確認します。
sudo a2enmod rewrite
sudo systemctl restart apache2
  1. Apacheの設定ファイルで.htaccessの使用を許可します。
<Directory /var/www/html>
    AllowOverride All
</Directory>
  1. RewriteCondの条件式を見直し、正規表現や変数が正しく設定されているか確認します。

例3:正規表現の誤りを修正

RewriteCond %{REQUEST_URI} ^/blog
RewriteRule ^(.*)$ /index.php?page=blog [L]
  • /blogへのアクセスがリライトされない場合、^/blogの正規表現が正しいか確認します。

3. 特定の条件でリダイレクトが動作しない


症状
特定のデバイスやブラウザでリダイレクトが適用されない。

原因
ユーザーエージェントの条件式が間違っている場合があります。

解決方法
ユーザーエージェントの正規表現を見直し、必要に応じて[NC](大文字小文字を区別しない)フラグを追加します。

例4:ユーザーエージェントの正規表現修正

RewriteCond %{HTTP_USER_AGENT} (iPhone|Android|ipad) [NC]
RewriteRule ^(.*)$ https://m.example.com/$1 [L,R=302]
  • iPadがリダイレクト対象に含まれていない場合は、ipadを追加します。

4. 403 Forbidden エラーの発生


症状
リライト後に403エラーが表示される。

原因
リファラー制限やIP制限が過剰に適用されている場合があります。

解決方法
条件を緩和し、誤って正当なユーザーをブロックしていないか確認します。

例5:特定のリファラーを許可する

RewriteCond %{HTTP_REFERER} !^https?://trusted\.example\.com [NC]
RewriteRule ^.*$ - [F]
  • trusted.example.com以外のリファラーをブロックするルールで、必要なリファラーを追加します。

5. 正規表現のマッチングエラー


症状
条件が一致しないためリライトが行われない。

原因
正規表現の記述ミスやエスケープ漏れが原因です。

解決方法

  • ドットやスラッシュはエスケープします(例: \.com)。
  • ^$ などのアンカーを適切に使用して範囲を限定します。

例6:正規表現ミスの修正

RewriteCond %{HTTP_HOST} ^www.example.com$ [NC]
RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]
  • ドメイン名のドットは \. でエスケープします。

トラブルシューティングのポイント

  1. Apacheのエラーログを確認し、どのルールで問題が発生しているか特定します。
tail -f /var/log/apache2/error.log
  1. リライトルールを一行ずつコメントアウトし、問題のあるルールを特定します。
  2. テスト環境で動作を確認しながら、設定を段階的に適用します。

次のセクションでは、RewriteCondを活用した具体的な応用例について解説します。

まとめ


本記事では、Apache mod_rewriteのRewriteCondディレクティブを活用した条件付きURLリライトの基本から応用例までを解説しました。

RewriteCondを使うことで、アクセス元のIPアドレス、ユーザーエージェント、リファラー、環境変数などを条件にリライト処理を細かく制御できます。これにより、HTTPSへの強制リダイレクトモバイルデバイス向けのリダイレクトアクセス制限など、多様なシナリオに対応可能です。

さらに、リダイレクトループやリライト不適用といったトラブルシューティング方法も紹介し、設定ミスを防ぐためのポイントを説明しました。

RewriteCondの柔軟性を理解し、正しく活用することで、セキュリティ強化やユーザーエクスペリエンスの向上が期待できます。適切なリライトルールを設定し、サイト運営の効率化に役立ててください。

コメント

コメントする

目次
  1. mod_rewriteとRewriteCondの概要
    1. RewriteCondの特徴
    2. RewriteCondの利用シーン
  2. RewriteCondの基本構文と使用例
    1. RewriteCondの構文の解説
    2. 基本的なRewriteCondの例
    3. RewriteCondを活用するメリット
  3. RewriteCondのフラグとその役割
    1. 主要なRewriteCondのフラグ一覧
    2. フラグの組み合わせ例
    3. フラグを活用するメリット
  4. 環境変数やHTTPヘッダーを使った条件付きリライト
    1. 環境変数を使ったRewriteCondの例
    2. HTTPヘッダーを使ったRewriteCondの例
    3. IPアドレスやホストを使ったRewriteCondの例
    4. リクエストメソッドを条件にしたリライト
    5. RewriteCondで環境変数を利用するメリット
  5. IPアドレスやリファラーでのアクセス制限例
    1. IPアドレスを使ったアクセス制限
    2. リファラーを使ったアクセス制限
    3. 特定のリファラーからのアクセスを特定ページにリダイレクト
    4. IPアドレスとリファラーを組み合わせたアクセス制限
    5. アクセス制限のメリット
  6. SSLの強制リダイレクトとRewriteCond
    1. RewriteCondを使ったHTTPSへの強制リダイレクト
    2. 特定ディレクトリだけをHTTPSにリダイレクト
    3. 逆にHTTPSをHTTPにリダイレクトする方法
    4. IPアドレスを条件にHTTPSリダイレクトを適用
    5. リダイレクトループを防ぐためのポイント
    6. HTTPS強制リダイレクトのメリット
  7. モバイルデバイス向けのURLリライト方法
    1. ユーザーエージェントを使ったモバイル判定
    2. モバイルデバイスを判定してリダイレクトする基本例
    3. モバイル以外のデバイスをPCサイトに戻す方法
    4. 特定ページのみモバイル向けにリダイレクト
    5. レスポンシブサイトへのリダイレクト回避
    6. キャッシュを考慮したリダイレクト例
    7. リダイレクトループを防ぐ方法
    8. モバイルリダイレクトのメリット
  8. RewriteCondを使ったトラブルシューティング
    1. 1. リダイレクトループの発生
    2. 2. リライトが適用されない
    3. 3. 特定の条件でリダイレクトが動作しない
    4. 4. 403 Forbidden エラーの発生
    5. 5. 正規表現のマッチングエラー
    6. トラブルシューティングのポイント
  9. まとめ