頑張らない!でも諦めない!必死にならずにええかげん

【一発理解】mod_rewriteのURL転送が動かず迷ったらこれを確認(相対ディレクトリ)

   

Google or AdMax Promotion(it)

mod_rewriteを利用してURL転送を行おうと思った際に、
「何故かうまく動かない」そんな経験は誰しもあるのではないでしょうか。
これをみれば「あーなるほど」となる理解度が高まる転送例をご紹介します。
ここでは「RewriteCond %{REQUEST_URI}」とRewriteRuleによる、
現在ディレクトリ(相対ディレクトリ)の違いについてご紹介します。

 

ディレクトリ判定の違い

mod_rewriteのURL転送が動かない時に、
そもそも比較対象にしているディレクトリパスの指定に誤りがある場合がほとんどです。

 

ルートパス上の.htaccess例

以下は「one-solution.trce.info」ドメインの
公開パスのルートに配置した.htaccessの例です。

この例については以下で前回ご紹介しています。

 

http://one-solution.trce.info/.htaccess

 

このパターンでは、以下のようなスラッシュ有無についてご紹介しました。

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

 

サブディレクトリに配置した.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での指定と同じ判定になっています。

 

なんか面倒くさく、とっつきにくい仕様だと思いませんか?

 

プロモーション(btm)

Google or AdMax Promotion (it)

mod_rewriteの記述の大前提

RewriteCond では.htaccessがどこのディレクトリに配置されていても、
ルートディレクトリからのフルパスで指定する必要があります。

RewriteRule では.htaccessが配置されている現在パスからパスの比較が行われます。

 

さらに下位のディレクトリであってもこの法則は同じです。

http://one-solution.trce.info/subdirecrory/deepdirectory/.htaccess

「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による転送で、
さまざまなパターンによる転送例をご紹介しています。

 

 


*本ページ内に記載されされた各社ブランド、サービス名、商標、登録商標については、
各社ブランドのロゴや商標等に関する帰属についてをご確認ください


最後までお読みいただきありがとうございました。
アルゴリズン


役に立ったと思っていただけたら、以下からシェア頂けたら幸いです^^

QRコードからもこのURLを開けます。

Pitta Promotion

アイキャッチ画像に利用させて頂いております、各社ブランドのロゴやシンボルに関しては、
各社ブランドのロゴや商標等に関する帰属についてをご確認頂けますようお願い致します。
ロゴの使用等に関する苦情・ご意見等がございましたら管理者までご連絡ください。

AdMax Promotion

カテゴリ
すべて展開 | すべて省略

Rakuten Promotion

 - Apache

  関連記事