毎回ググってるけど、いつになったらrewrite覚えるの?(‾◡◝)
という心の声が聞こえたので、覚えないためにここに書きます。
<IfModule mod_rewrite.c> # URL書き換えを許可 RewriteEngine on # URL書き換え後のベースになるパス (指定しなかったらhtaccessの物理パス) RewriteBase /sample/public # rewriteその1 # RewriteRule <置換前> <置換後> # .htaccessがあるディレクトリへのアクセスを{RewriteBase}/index.phpに飛ばす。 # [L]があるので、マッチしたら、これより下のルールは適用せずに終了する RewriteRule ^(/)?$ index.php/$1 [L] # rewriteその2 # RewriteCond ルールが適用される条件を追加する。 # (ファイルが存在する場合はすぐ下のルールを適用しない) RewriteCond %{REQUEST_FILENAME} !-f # (ディレクトリが存在する場合はすぐ下のルールを適用しない) RewriteCond %{REQUEST_FILENAME} !-d # ~~にアクセスが来たら{RewriteBase}/index.php/~~に書き換え。 RewriteRule ^(.*)$ index.php/$1 [L] </IfModule>
動きを大体まとめると
localhost/sample/public/index.phpのような構成だとしたら
- rewriteその1
localhost/sample/へのアクセスが sample/public/index.phpに書き換えられる。
- rewriteその2
localhost/sample/foo/barへのアクセスがsample/public/index.php/foo/barに書き換えられる。
FuelのURL構造、localhost/index.php/<コントローラ>/<メソッド>/<引数1>/・・・を頭に入れておくと少しわかりやすくなる。
実際にはlocalhost/<コントローラ>/<メソッド>/<引数1>/・・・のようにアクセスしたい。
今回はサブディレクトリsampleにFuelを入れているので
localhost/sample/index.php/<コントローラ>/<メソッド>/<引数1>/・・・に
localhost/sample/<コントローラ>/<メソッド>/<引数1>/・・・
の形でアクセスできるように設定している。
参考
» [.htaccess] リライト(サイトの移転・wwwの有無を統一・アクセス制限) AIDREAM
RewriteCond %{REQUEST_FILENAME}の衝撃 - 雑記 - Yahoo!ブログ
Apache: RewriteBaseは書き換え後のパスのベース - log.nissuk.info
最後の参考サイトに
RewriteRuleに渡ってくるパスがスラッシュから始まるのはhttpd.confにRewriteRuleを書いた時だけで、.htaccessに書いた時は.htaccessが置いてあるディレクトリからの相対パス(上記例だと abc/def.html。RewriteLogで「strip per-dir prefix」と書かれている箇所)がRewriteRuleに渡ってくるため最初のスラッシュがマッチしなくなります。
と書いてあって、rewriteその1に関して?あるからいいけど事実上"/"にマッチするケースはないのではないか説が自分の中にありますが、どうなんでしょうか。