mod_rewriteを使った内容を忘れないためにメモ。
- mod_rewriteを使う
RewriteEngine On/Off
RewriteBase /
- 末尾を/で閉じる
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{REQUEST_URI} !\.[^/\.]+$
RewriteRule ^(.*)$ $1/ [R=301,L]
- 末尾の.htmlを/に置換
RewriteCond %{REQUEST_FILENAME} !-f //ファイルがない場合
RewriteRule ^(.*)\.html?$ $1/ [R=301,L]
- 動的URLを静的URLに見せる
RewriteCond %{REQUEST_FILENAME} !-f //ファイルがない場合
RewriteCond %{REQUEST_FILENAME} !-d //ディレクトリがない場合
RewriteRule ^(.*)/$ /index.php?id=$1 [L]
※(.*)の内容=$1
- GETリクエストの処理
RewriteCond %{QUERY_STRING} ^(.*)id=(.*)$
RewriteRule ^index.php$ /%2/? [R=301,L]
※最初の(.*)=%1、次の(.*)=%2
mod_rewriteを使うに当たって苦しんだ点があったので、こちらもメモ。
- 記載する順番
↑のサンプルを書きましたが、記述する順番によって思ったとおりの動作にならない場合がありますので、ハマりそうになったときは順番を見直しましょう。
- 無限ループ
詳しい内容は書けませんが、1~5のサンプルをそのまま記述したらapache内部でリダイレクトのループが発生したケースがありました。
ループしないよう思考錯誤しましたが、知識と経験の無さから対応できず・・・
最終的に、PHP側で対応。
★やりたかったこと
http://www.hoge.com/index.php?id=xxx&page=yyy
↓
http://www.hoge.com/xxx/yyy/
★PHPで対応した内容
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://www.hoge.com/" . $_GET["id"] . "/" . $_GET["page"]);
※SEOを考慮し、301のリターンコードを返すようにしました