平成30/ 2018-12-19 21:48
Apache/mod rewrite/ループしてしまう場合は適当なパラメータつけて回避する
GETパラメータを評価しリダイレクトさせる。値もとる

/search/?company_id=111  なURLを、/search/111/  にリダイレクトさせる。但し、rewrite=1 がある場合は対象外とする。
とする。

RewriteCond %{REQUEST_URI} ^/search
RewriteCond %{QUERY_STRING} company_id=([0-9]+)
RewriteCond %{QUERY_STRING} !rewrite=1
RewriteRule ^.*$ /search/%1/? [R,L]

/search/111/  のリダイレクト先を、/search/?company_id=$1&rewrite=1 にすることでループを防ぐ。

RewriteRule search/([0-9]+)/?$ /search/?company_id=$1&rewrite=1 [QSA,L]


<リダイレクトの仕組み>
1.ループになる原因。
/search/?company_id=111
で、
/search/111/
にリダイレクトさせ、
/search/111/ で、
/search/?company_id=111
にリダイレクトさせると、
再び以下のリダイレクトになるので、ループになってしまう。
/search/?company_id=111
で、
/search/111/

2.RewriteRule は、getパラメータを評価しない。
なので、getパラメータある場合は、
以下のように、RewriteCondとQUERY_STRINGを使う。
()でマッチさせた値は、%1 として、RewriteRuleに利用できる。

RewriteCond %{REQUEST_URI} ^/search
RewriteCond %{QUERY_STRING} company_id=([0-9]+)
RewriteCond %{QUERY_STRING} !rewrite=1
RewriteRule ^.*$ /search/%1/? [R,L]