【一発理解】mod_rewriteのURL転送が動かず迷ったらこれを確認(相対ディレクトリ)
mod_rewriteを利用してURL転送を行おうと思った際に、
「何故かうまく動かない」そんな経験は誰しもあるのではないでしょうか。
これをみれば「あーなるほど」となる理解度が高まる転送例をご紹介します。
ここでは「RewriteCond %{REQUEST_URI}」とRewriteRuleによる、
現在ディレクトリ(相対ディレクトリ)の違いについてご紹介します。
ディレクトリ判定の違い
mod_rewriteのURL転送が動かない時に、
そもそも比較対象にしているディレクトリパスの指定に誤りがある場合がほとんどです。
ルートパス上の.htaccess例
以下は「one-solution.trce.info」ドメインの
公開パスのルートに配置した.htaccessの例です。
この例については以下で前回ご紹介しています。
http://one-solution.trce.info/.htaccess
1 2 3 4 5 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI} ^/$ RewriteRule ^$ http://redirect.trce.info/one-solution/ [R=302,L] </IfModule> |
このパターンでは、以下のようなスラッシュ有無についてご紹介しました。
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^$ http://redirect.trce.info/one-solution/ [R=302,L]
実際に転送の挙動を確認してみます。
http://one-solution.trce.info/ へアクセスすると、
http://redirect.trce.info/one-solution/ へ転送されるのが確認できると思います。
要求URL | 転送 可否 |
転送先URL |
---|---|---|
http://one-solution.trce.info/ | ⇒ | http://redirect.trce.info/one-solution/ |
この違いによってパスの指定誤りをしやすくなる原因になっていると思います。
さらに、.htaccessファイルをサブディレクトリ内に配置した場合には、
以下のようなさらに困惑するような判定が行われています。
サブディレクトリパス上の.htaccess例
.htaccessはドメインのルートだけでなく、
ディレクトリ内に対して個々に配置することができるのはご存知のことでしょう。
以下は、サブディレクトリに対して.htaccessを設置している例です。
同じように外部のドメインにURL転送を行います。
http://one-solution.trce.info/subdirecrory/.htaccess
1 2 3 4 5 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI} ^/subdirecrory/$ RewriteRule ^$ http://redirect.trce.info/one-solution/subdirecrory/ [R=302,L] </IfModule> |
サブディレクトリに配置した.htaccessにて転送先の「subdirecrory/」へ転送しています。
RewriteCond %{REQUEST_URI} ^/subdirecrory/$
RewriteRule ^$ http://redirect.trce.info/one-solution/subdirecrory/ [R=302,L]
実際に転送の挙動を確認してみます。
http://one-solution.trce.info/subdirecrory/ へアクセスすると、
http://redirect.trce.info/one-solution/subdirecrory/ へ転送されるのが確認できると思います。
要求URL | 転送 可否 |
転送先URL |
---|---|---|
http://one-solution.trce.info/subdirecrory/ | ⇒ | http://redirect.trce.info/one-solution/subdirecrory/ |
気付きましたでしょうか。
「RewriteCond」に対して指定している条件パスは「/subdirecrory/」を比較しています。
かたや、
RewriteRule では、要求パスを「^$」 ですから「空文字」と比較しています。
※これはドメインルートに配置した.htaccessでの指定と同じ判定になっています。
なんか面倒くさく、とっつきにくい仕様だと思いませんか?
mod_rewriteの記述の大前提
RewriteCond では.htaccessがどこのディレクトリに配置されていても、
ルートディレクトリからのフルパスで指定する必要があります。
RewriteRule では.htaccessが配置されている現在パスからパスの比較が行われます。
さらに下位のディレクトリであってもこの法則は同じです。
http://one-solution.trce.info/subdirecrory/deepdirectory/.htaccess
1 2 3 4 5 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI} ^/subdirecrory/deepdirectory/$ RewriteRule ^$ http://redirect.trce.info/one-solution/subdirecrory/deepdirectory/ [R=302,L] </IfModule> |
「RewriteRule ^$ 」は下位ディレクトリでも、
.htaccessを配置したディレクトリが常に空文字との判定になります。
実際にアクセスしてみても正しく転送されます。
http://one-solution.trce.info/subdirecrory/deepdirectory/ へアクセスすると、
http://redirect.trce.info/one-solution/subdirecrory/deepdirectory/ へ
転送されるのが確認できると思います。
要求URL | 転送 可否 |
転送先URL |
---|---|---|
http://one-solution.trce.info/subdirecrory/deepdirectory/ | ⇒ | http://redirect.trce.info/one-solution/subdirecrory/deepdirectory/ |
それぞれ、以下の値との比較が行われています。
- RewriteCond : /subdirectory/deepdirectory/
- RewriteRule : (現在パス)
さて、このRewriteRuleが.htaccessの設置ディレクトリからの相対パスで比較され、
RewriteCond(%{REQUEST_URI})は、
ドメインルートからのフルパスで比較されることを意識していましたか?
なんとなくRewriteRuleには「(.*)」として、全転送を指定してしまって、
RewriteCond側で%{REQUEST_URI}による条件判定としていることも多いでしょう。
呪文のように使われている(.*)ですが、
そもそもRewriteRule のみの1行で事足りることも多いと思います。
さいごに
この仕組みを利用すると、
現在パス以下のディレクトリへのアクセスのみに対してURL転送を行う場合には、
RewriteRuleでディレクトリへのアクセスのみの条件を記述すれば、
上位ディレクトリの長いパスを省略して判定できます。
サブディレクトリに個別に配置した.htaccessで、
URL転送を行う場合には、RewriteRuleで転送を行う方がスマートでしょう。
尚、こうしたmod_rewriteによる転送パターンは、
実際に検証をおこなって、挙動を確認しています。
以下ではなんとなく理解しているつもりのmod_rewriteによる転送で、
さまざまなパターンによる転送例をご紹介しています。
Apache,Apache Hadoop,Apache Subversion,Hadoop,HDFS,HBase,Hive,Mahout,Pigは、
Apache Software Foundationの米国およびその他の国における登録商標または商標です。
ApacheソフトウェアはApache Software License (原文)および
Apache License, 2.0 (原文)に基づきOpen Source Initiativeに承認されライセンスされています。
関連記事
-
[コンピュータに MSVCR110.dllがない]とApacheMonitor.exeを起動して言われた場合
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
(apache 2.0.65)ローカル環境(windows)へのApache設置
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
(mod_fastcgi on 2.0.x)windowsでCGIをFastCGIで実行するように設定する
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
PHPをmod_fcgidやmod_fastcgiでFastCGI実行する方法
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
IPアドレスから.htaccess用のネットマスク変換できるサイトが便利
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
Apacheインストール直後にコマンド画面でエラーが表示された場合の対処法
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
LimitディレクティブでGET,POSTを制限する
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
(mod_fcgid on 2.2.x)windowsでCGIをFastCGIで実行するように設定する
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
(lounge mod_fcgid on 2.4.6)windowsでCGIをFastCGIで実行するように設定する
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
(lounge Apache 2.4.6)ローカル環境(windows)へのApache設置
Google or AdMax Promotion(it) 禁断の機能がau公式 …