RewriteCondが効かない?特定のディレクトリを除外する方法でつまずいたお話

CakePHPをトップディレクトリから利用しています。

http://********/ でアクセスする感じ

このとき、 http://********/pc/ へのアクセスは Rewrite させたくないなぁと思い、 htdocs/.htaccess の中に RewriteCond を指定したのですがどうにこうにも上手くいきませんでした。

<IfModule mod_rewrite.c>
   RewriteEngine  on
   RewriteCond    %{REQUEST_URI}  !(^/pc/)
   RewriteRule    ^$ app/webroot/    [L]
   RewriteRule    (.*) app/webroot/$1 [L]
</IfModule>

なんでじゃぁぁぁ とクタクタになりかけたその時、こちらのサイトの一文がすごく参考に‥。
 .htaccessの書き方 (murashun.jp)

RewriteCondの処理順は、どうやら先に RewriteRule をマッチングで確認し、その後にその上に書かれている条件 RewriteCond のマッチングをして処理にすすむ仕様のようです。

つまり、

   RewriteCond    A  B
   RewriteRule    C  HOGEEEE

とかかれている場合は、まず条件 C にマッチして、かつ A が B にマッチする場合は HOGEEEE にぶっ飛ばす動きとなります。

これを踏まえ、先ほどの .htaccess を下記のように変更しました。

<IfModule mod_rewrite.c>
   RewriteEngine  on
   RewriteCond    %{REQUEST_URI}  !(^/pc/)
   RewriteRule    ^$ app/webroot/    [L]
   RewriteCond    %{REQUEST_URI}  !(^/pc/)
   RewriteRule    (.*) app/webroot/$1 [L]
</IfModule>

無事にリダイレクトされないようになりました!!!

恐るべしスイス製アーミーナイフ。

3 COMMENTS

WEB学習中

今更ながら、同じような状況で困って検索していたら、こちらの記事を見つけました。
お蔭様で、RewriteCondの順番を入れ替えたら上手くいきました。
非常に嬉しかったので、せめて御礼をと思い、コメント致します。
ありがとうございました!

返信する
おかしら

コメントありがとうございます。
お役に立てて良かったです!!
まさかそこか‥ と思える点ですよね。。。私もこれに気が付くまで苦労しました。。。。

返信する
匿名

単純に

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/pc/
RewriteRule ^(.*)$ app/webroot/$1 [L]

で済む話ですね。

返信する

コメントを残す

メールアドレスが公開されることはありません。