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

【一発理解】mod_rewriteのURL転送が動かず迷ったらこれを確認(パスのスラッシュ)

      2014/12/18

Google or AdMax Promotion(it)

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

 

URL転送が動かず迷ったらこれを確認

mod_rewriteのURL転送が動かない時のチェックポイントを、
ご紹介するよりは以下の転送例を見て頂いた方が早いと思います。

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

 

この転送パターンを見て何か疑問を感じないでしょうか。

以下の点です。

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/

 

ちゃんと転送されます^^

 

プロモーション(btm)

Google or AdMax Promotion (it)

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

 

この場合それぞれ以下のように転送されることが確認できます。

要求URL 転送
可否
転送先URL
http://one-solution-s1.trce.info/ http://one-solution-s1.trce.info/
http://one-solution-s1.trce.info/source1/ http://redirect.trce.info/one-solution-s1/dist1/
http://one-solution-s1.trce.info/source11/ http://redirect.trce.info/one-solution-s1/dist11/
http://one-solution-s1.trce.info/source111/ http://redirect.trce.info/one-solution-s1/dist111/

 

パターン2確認環境

パターン2の例は以下で確認できます。

.htaccessでは以下のように定義しています。

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

 

この場合それぞれ以下のように転送されることが確認できます。

要求URL 転送
可否
転送先URL
http://one-solution-s2.trce.info/ http://one-solution-s2.trce.info/
http://one-solution-s2.trce.info/source1/ http://redirect.trce.info/one-solution-s2/dist1/
http://one-solution-s2.trce.info/source11/ http://redirect.trce.info/one-solution-s2/dist11/
http://one-solution-s2.trce.info/source111/ http://redirect.trce.info/one-solution-s2/dist111/

 

どうでしょうか、非常に基本的な部分ではありますが、
いつも意識して記述していましたでしょうか。

呪文のように使われている(.*)ですが、
そもそもRewriteRule のみの行で事足りることも多いと思います。

 

さいごに

様々な転送例は多くのサイトで紹介されていると思いますが、
細かなポイントはあまり紹介されていないというか、

これなら転送できますという1つの例が紹介されていることが大半の印象です。

でも、なんで転送ができるのか?という点や、
どうしてこの記述になるのか?といった点に言及されていないことが多くあります。

 

このポイントだけは押さえて、
あとは要求されるURLのパターンを組み立てれば済むはずです。

実はつまずくポイントの最初がこのスラッシュの有無による違いだと私は思います。

 

尚、こうしたmod_rewriteによる転送パターンは、
実際に検証をおこなって、挙動を確認しています。

以下ではなんとなく理解しているつもりのmod_rewriteによる転送で、
さまざまなパターンによる転送例をご紹介しています。

 

 


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


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


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

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

Pitta Promotion

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

AdMax Promotion

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

Rakuten Promotion

 - Apache

  関連記事