mod_rewriteのRewriteCondとRewriteRuleの使い方
業務で.htaccessにリダイレクト設定書くとき詰まったので使い方とかの備忘録。
基本的な形
.htaccessに書くときの基本形は以下のとおり。
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond hoge fuga RewriteRule piyo poyo </IfModule>
事前にhttpd.confでmod_rewriteが有効になってる前提です。
RewriteRule
URL書き換えのルールを指定します。以下はhoge.com/test/
以下に置いた.htaccessの場合。
RewriteRule ^test1¥.html$ test/test2.html [R=301,L]
この場合、hoge.com/test/test1.html
へのアクセスがhoge.com/test/test2.html
にリダイレクトされます。
RewriteRule ^(.+)¥.html$ test2/$1.html [R=301,L]
こんな感じで書くと、グループ化した正規表現にマッチした文字列をリダイレクト先の$1で変数のように使うことも出来ます。
RewriteCond
RewriteRuleを実行するための条件を指定します。直後のRewriteRuleのみに適用されます。以下もhoge.com/test/
以下に置いた.htaccessの場合。
RewriteCond %{QUERY_STRING} ^q=test$ RewriteRule ^test1¥.html$ test/test2.html? [R=301,L]
この場合、q=test
というクエリがついたアクセスがあった場合のみ2行目のRewriteRuleが適用されます。つまり、hoge.com/test/test1.html?q=test
へのアクセスがhoge.com/test/test2.html
にリダイレクトされます。ちなみにRewriteCondを複数行書くとANDで条件を指定できます(後述するフラグで[OR]と明示的に指定すればORで条件を指定することも可能)。
また、RewriteRuleのリダイレクト先指定の最後に?をつけると、クエリが削除されてリダイレクトされます。
参考
Apache module mod_rewrite
RewriteRule でredirect時にquery stringを削除する - うまいぼうblog
Apache変数、フラグ
上記RewriteCondで指定した%{QUERY_STRING}
はApacheで用意されている変数で、クエリ文字列を表します。Apacheが用意している変数は他にもいろいろあります。
参考:Apache RewriteCond の基礎知識 | WEB ARCH LABO
RewriteRuleの行末に指定した[R=301,L]
はフラグと呼ばれるものです。Rはリダイレクト、Lはこのルールにマッチしたら以降のルールは無視することを表しています。フラグも他にいくつか種類があります。