LoginSignup
11

More than 5 years have passed since last update.

(仮題)とにかく URL を書き換えたい人のための、5 分で解った気になる mod_rewrite

Last updated at Posted at 2016-07-12

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?rewritehttp://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?rewritehttp://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?rewritehttp://example.com/moge/mogemoge.html?rewritten&rewrite にリライトされる。

クエリストリングを消したい

RewriteCond %{QUERY_STRING} rewrite
RewriteRule ^hoge/hogehoge.html /moge/mogemoge.html?

変換後の URL の末尾に ? を付けて、「空のクエリストリングを付けます(つまりクエリストリングを付けません)」と明示してあげればよい。

クエリストリングを部分的に削除したり置き換えたりしたい

RewriteCond で後方参照を駆使して頑張ってください。

Not rewrite

何もしない

RewriteRule ^hoge/ -

変換後を - にすると「何もしない」を表す。何もしないので、リライトは、終わる。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11