Overview
当然タイトルは釣りです。5分で mod_rewrite が「わかる」わけないです。
あと、恐らく永遠に書きかけです。
つまり、この記事は要するにただの私の覚書です。あえて説明を端折ったり簡略化したりしているせいで、もしくは本当に私の理解不足のため、不正確な記述があるかもしれません。
正しい情報を得たければ公式ドキュメントを読みましょう。
Let's rewrite
単純に書き換える基本形
RewriteRule ^hoge/ /moge/
前の "^hoge/" がマッチさせたいパターン、うしろの "moge" がマッチした文字列に対する変換後の文字列。
マッチさせたいパターンは、あえて厳密でなくざっくりとした表現をすると、「相対パス」に対して検索をかけるので頭に "/" を付けてはならない。
フラグをつけないとリダイレクトにはならない。URL は変わらずに中身だけ変わる。
後方参照できる
RewriteRule
のパターンで "()" で囲った文字は $N(N=0...9) で後方参照できる
RewriteRule ^hoge/hoge(01.html) /moge/moge$1
RewriteCond
のパターンで "()" で囲った文字は %N(N=0...9) で後方参照できる
RewriteCond %{QUERY_STRING} filename=(moge01.html)
RewriteRule ^hoge/hoge01.html /moge/%1
クエリストリング
クエリストリングは検索対象に「含まれない」
そのため、以下のような検索は「できない」
RewriteRule ^hoge/hogehoge.html?rewrite /moge/mogemoge.html
クエリストリングを条件に入れたいときは RewriteCond
を使う
RewriteCond %{QUERY_STRING} rewrite
RewriteRule ^hoge/hogehoge.html /moge/mogemoge.html
クエリストリングを維持したい
クエリストリングは検索対象には含まれないが、何もしなければ変換後の URL に対しても存在は維持される
つまり、上記の例だと http://example.com/hoge/hogehoge.html?rewrite
は http://example.com/moge/mogemoge.html
ではなく http://example.com/moge/mogemoge.html?rewrite
にリライトされる。
クエリストリングを置き換えたい
変換後文字列にクエリストリングを含めると、クエリストリングは置き換えられる。
RewriteCond %{QUERY_STRING} rewrite
RewriteRule ^hoge/hogehoge.html /moge/mogemoge.html?rewritten
この場合、http://example.com/hoge/hogehoge.html?rewrite
は http://example.com/moge/mogemoge.html?rewritten
にリライトされる。
クエリストリングを追加したい
RewriteCond %{QUERY_STRING} rewrite
RewriteRule ^hoge/hogehoge.html /moge/mogemoge.html?rewritten [QSA]
フラグ QSA
をつけると、変換後の文字列にクエリストリングが含まれていても変換元のクエリストリングを消さずに追加するようになる。
つまり、http://example.com/hoge/hogehoge.html?rewrite
は http://example.com/moge/mogemoge.html?rewritten&rewrite
にリライトされる。
クエリストリングを消したい
RewriteCond %{QUERY_STRING} rewrite
RewriteRule ^hoge/hogehoge.html /moge/mogemoge.html?
変換後の URL の末尾に ?
を付けて、「空のクエリストリングを付けます(つまりクエリストリングを付けません)」と明示してあげればよい。
クエリストリングを部分的に削除したり置き換えたりしたい
RewriteCond
で後方参照を駆使して頑張ってください。
Not rewrite
何もしない
RewriteRule ^hoge/ -
変換後を - にすると「何もしない」を表す。何もしないので、リライトは、終わる。