【一発理解】mod_rewriteのURL転送が動かず迷ったらこれを確認(パスのスラッシュ)
2014/12/18
mod_rewriteを利用してURL転送を行おうと思った際に、
「何故かうまく動かない」そんな経験は誰しもあるのではないでしょうか。
これをみれば「あーなるほど」となる理解度が高まる転送例をご紹介します。
ここでは「RewriteCond %{REQUEST_URI}」とRewriteRuleによる、
ディレクトリ判定の違いについてご紹介します。
URL転送が動かず迷ったらこれを確認
mod_rewriteのURL転送が動かない時のチェックポイントを、
ご紹介するよりは以下の転送例を見て頂いた方が早いと思います。
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]
RewriteCond では、URL(%{REQUEST_URI})と「/」を比較しています。
かたや、
RewriteRule では、要求パスを「^$」 ですから「空文字」と比較しています。
実際に転送の挙動を確認してみます。
http://one-solution.trce.info/ へアクセスすると、
http://redirect.trce.info/one-solution/ へ転送されるのが確認できると思います。
要求URL | 転送 可否 |
転送先URL |
---|---|---|
http://one-solution.trce.info/ | ⇒ | http://redirect.trce.info/one-solution/ |
ちゃんと転送されます^^
mod_rewriteの記述の大前提
RewriteCond では 要求パスに「/」がルートとして付与されてくきます。
RewriteRule では要求パスは空文字から始まります。
サブディレクトリであってもこの法則は同じです。
「http://one-solution.trce.info/dir/」へのアクセス要求は、
それぞれ、以下の値との比較が行われています。
- RewriteCond : /dir/
- RewriteRule : dir/
※dir/へのアクセスは http://one-solution.trce.info/ には、
転送設定を行っていませんので確認できません。
さて、このスラッシュの有無を意識して、
URL転送の記述を行っていましたか?
なんとなくRewriteRuleには「(.*)」として、全転送を指定してしまって、
RewriteCond側で%{REQUEST_URI}による条件判定としていることも多いでしょう。
記述の違いによる転送例
上記を踏まえて、それぞれ
RewriteCondによる判定と、RewriteRuleによる判定を行うと、
以下のように記述することができます。
パターン1
RewriteCond %{REQUEST_URI} ^/source(.*)/$
RewriteRule .* http://redirect.trce.info/one-solution-s1/dist%1/ [R=302,L]
と書くよりは、
パターン2
以下のように1行で書いた方がシンプルだったりします。
転送先が増えてくれば、行数は倍の違いが出てきますし、
できるだけ、.htaccessは小さく保ちたいものです。
RewriteRule ^source(.*)/(.*) http://redirect.trce.info/one-solution-s2/dist$1/$2 [R=302,L]
パターン1確認環境
パターン1の例は以下で確認できます。
.htaccessでは以下のように定義しています。
http://one-solution-s1.trce.info/.htaccess
1 2 3 4 5 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI} ^/source(.*)/$ RewriteRule .* http://redirect.trce.info/one-solution-s1/dist%1/ [R=302,L] </IfModule> |
この場合それぞれ以下のように転送されることが確認できます。
パターン2確認環境
パターン2の例は以下で確認できます。
.htaccessでは以下のように定義しています。
http://one-solution-s2.trce.info/.htaccess
1 2 3 4 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^source(.*)/(.*) http://redirect.trce.info/one-solution-s2/dist$1/$2 [R=302,L] </IfModule> |
この場合それぞれ以下のように転送されることが確認できます。
どうでしょうか、非常に基本的な部分ではありますが、
いつも意識して記述していましたでしょうか。
呪文のように使われている(.*)ですが、
そもそもRewriteRule のみの行で事足りることも多いと思います。
さいごに
様々な転送例は多くのサイトで紹介されていると思いますが、
細かなポイントはあまり紹介されていないというか、
これなら転送できますという1つの例が紹介されていることが大半の印象です。
でも、なんで転送ができるのか?という点や、
どうしてこの記述になるのか?といった点に言及されていないことが多くあります。
このポイントだけは押さえて、
あとは要求されるURLのパターンを組み立てれば済むはずです。
実はつまずくポイントの最初がこのスラッシュの有無による違いだと私は思います。
尚、こうした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に承認されライセンスされています。
関連記事
-
PHP.iniに設定する設定値はhttpd.confや.htaccessに対しても設定が可能
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
ローカル環境のPHPをCGI実行させる方法をwindowsで試す
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
Apacheが「別のバージョンの製品が既にインストールされています。」言った時の対処法
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
(apache 2.2.25)ローカル環境(windows)へのApache設置
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
(lounge mod_fcgid on 2.4.6)windowsでCGIをFastCGIで実行するように設定する
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
(mod_fcgid on 2.0.x)windowsでCGIをFastCGIで実行するように設定したかった
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
プログラムをwindowsのサービスとして追加する(Apacheの例)
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
IPアドレスから.htaccess用のネットマスク変換できるサイトが便利
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
(mod_fastcgi on 2.2.x)windowsでCGIをFastCGIで実行するように設定する
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
LimitディレクティブでGET,POSTを制限する
Google or AdMax Promotion(it) 禁断の機能がau公式 …