waste of time

主にPHP

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はこのルールにマッチしたら以降のルールは無視することを表しています。フラグも他にいくつか種類があります。

参考mod_rewrite - RewriteRuleのフラグと、RewriteCondの変数一覧 - Qiita