#はじめに
こんにちは、chrです。
みなさん、mod_rewrite書いてますか?
リダイレクトの時に使う方や、FWと連携させるのに使う方もいると思います。
サイトのリニューアルを行っていると、定義の量が増えると行数も多く、同じことを何度も書いているなぁと感じてました。
そこで、自分なりにmod_rewriteの書き方のベストプラクティスと感じた方法を共有します。
#結論
- 環境変数を使おう
- 環境変数使えば、何度も同じことを書かなくて良い
- プログラマっぽい考え方でmod_rewriteを書ける
- ただ、mod_rewriteへ求める要件が多くないと、コード量が増えるだけになるかも
#環境変数の定義方法
- RewriteRuleのoptionの値で定義します
.htaccess
RewriteRule ^lp/(.*)$ index.php?path=$1 [L,E=LP_REQUEST:On]
- E=が環境変数の定義開始記号、LP_REQUESTが環境変数名、Onが値です
- 環境変数を取得する場合は、以下のように書く事で取得できます
.htaccess
##環境変数で分岐
RewriteCond %{ENV:LP_REQUEST} ^On$
##環境変数をRewriteRuleの値内で使用(lp/hoge/へアクセスがあるとOnへrewriteされる
RewriteRule ^lp/hoge/$ %{ENV:LP_REQUEST} [L]
- これらを組み合わせることで、複雑な条件でも可読性を高めることができます
#改善したい例
- スマホで/sp/以外のURLへアクセスがあったら、/sp/配下の同一パスへリダイレクト
- スマホで/sp/配下のURLへアクセスがあったら、/の同一パスへリダイレクト
- デバイス:PC
- http://example.com/ -> リダイレクトしない
- http://example.com/hoge -> リダイレクトしない
- http://example.com/sp/ -> http://example.com/ へリダイレクト
- http://example.com/sp/hoge -> http://example.com/hoge へリダイレクト
- デバイス:スマートフォン
- http://example.com/ -> http://example.com/sp/ へリダイレクト
- http://example.com/hoge -> http://example.com/sp/hoge へリダイレクト
- http://example.com/sp/ -> リダイレクトしない
- http://example.com/sp/hoge -> リダイレクトしない
##良くある書き方でmod_rewriteを書いてみる
.htaccess
RewriteEngine On
##スマホデバイスの場合はリダイレクト
RewriteCond %{REQUEST_URI} !/sp/
RewriteCond %{HTTP_USER_AGENT} (iPod|iPhone|iPad|Android|Windows\ Phone)
RewriteRule ^(.*)$ http://example.com/sp/$1 [QSA,L,R=302]
##スマホデバイス以外の場合はリダイレクト
RewriteCond %{REQUEST_URI} /sp/
RewriteCond %{HTTP_USER_AGENT} !(iPod|iPhone|iPad|Android|Windows\ Phone)
RewriteRule ^sp/(.*)$ http://example.com/$1 [QSA,L,R=302]
##変更した例
.htaccess
#全てのデバイスをPCとして変数定義、デバイスの違いによるリダイレクトは常に有効とする
RewriteRule .* - [E=DEVICE:PC]
#スマートフォンからのリクエストの場合は、デバイスをSPとする
RewriteCond %{HTTP_USER_AGENT} (iPod|iPhone|iPad|Android|Windows\ Phone)
RewriteRule .* - [E=DEVICE:SP]
#スマートフォン用のURL定義
RewriteRule .* - [E=URL_SP:/sp/]
#リダイレクトの適応 PCで/sp/へアクセス
RewriteCond %{ENV:DEVICE} ^PC$
RewriteCond %{REQUES_URI} ^%{ENV:URL_SP}
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [QSA,L,R=302]
#リダイレクトの適応 SPで/sp/以外へアクセス
RewriteCond %{ENV:DEVICE} ^SP$
RewriteCond %{REQUEST_URI} !^%{ENV:URL_SP}
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{ENV:URL_SP}$1 [QSA,L,R=302]
##RewriteRuleの値で入力している「-」は「置換しない」です
- これだけ見ると、コード量が増えて、複雑化しているように見えます
- ですが、スマートフォンと判別するデバイスが増えた場合の変更箇所数はどうでしょうか
- URLにフラグがついていたらリダイレクトさせないといった処理や
- 本番環境のみ全ページSSLページへリダイレクトさせるといった処理が追加されたり
- ホスト名統一したいが、テスト環境ではホスト名がtestだったりと環境による違いがあったり。。。
- mod_rewriteへ求める要件が複雑化してきたら、導入をおすすめします