laravelのアプリをサブディレクトリ(notサブドメイン)に配置しなくてはならないケースがあり、.htaccessと格闘したのでメモを。
このパターンはハマりが多いですね・・・
http://skill-up-engineering.com/tag/rewrite/
といっても個別のアプリのケースを書いてもあまり意味はないので、対応方法について記して置こうかと思います。
Contents
基本はRewriteCondとRewriteRule
基本的にはリダイレクトのパターンはRewriteCond(このパターンだったら)とRewriteRule(このように書き換える)になるかと思います。
ただしRewriteCondは複数書くことができます。
うまく切り替わらない時は要は
- RewriteCondが効いていない(条件の正規表現が違うなど)
- 適切なRewriteRuleが効いていない
のいずれかになります。修正時のポイントですが、1、2を切り離して調査するようにしましょう。
お勧めとして、1が正確に動いているかどうかを見るには
1 2 |
RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ http://www.yahoo.co.jp [R] |
上記のように書いて見ましょう。
この場合、yahooに飛べば、RerwriteCondが動いているかどうかがはっきりとわかります。
RewriteBase
特にサブディレクトリのURLの書き換えとなりますと、
1 |
http://example.com/hoge/aaaa/bbb.html → http://example.com/hoge/aaaa/ccc.html |
のようなケースが発生します。
この場合、hogeのところまでが書き換え不要ですので、
1 |
RewriteBase /hoge |
のように書いておくと、hoge以降がパターンマッチングやリライトの対象になります。
L,Rなどのフラグに注意
RewriteRuleでURL自体は意図した動きをしているのに、
- 永久ループが発生している
- ブラウザのURLを変えたくないのに変わってしまう
など動きが微妙に異なっている場合があります。
この場合、
RewriteRuleの後についているフラグが大切になってきます。
代表的なものは
L・・lastの意味。ここでURLの書き換えをストップ
R=301・・301リダイレクト ページの移転や通常の書き換え
R=302・・302リダイレクト メンテ画面やエラー画面など
*基本的にリダイレクトをするとブラウザのURLが変わります。
リライトは複数回行われていることを疑う
リライトが意図しない動きをしている場合、複数回のリライトがされていることが一般的です。
その場合、LフラグやENDフラグをつけるなどして、処理をストップさせるようにしましょう。
プログラムとリソース系のファイルの扱いの違いに注意
ある程度の規模のアプリになるとプログラム(例えばPHP)とリソース系のファイル(css,js,画像)などは分岐されていることが一般的です。
プログラムの場合、ルーティングなどが設定されていることが多いので、特定のファイルに飛ばすにことが一般的です。(大抵はルートディレクトのindex.php)
逆にリソース系のファイルは直でURL通りにアクセすることが一般的ですので、URLのルールが違うことが多いです。
階層の優先度に注意
ある階層でhtaccessをかくとその下全てに影響します。
ですので、影響度をコントールしたい場合、階層などをうまく切り分けるようにしましょう。
デバッグ
デバッグのポイント(ログ出しやキャッシュの消去など)は下記リンクなどを。