はじめに
Apacheのmod_rewriteの設定をhttpd.confや.htaccessへ記載する際、ちょっと込み入ったことをしようとすると記載内容が複雑になり可読性が落ちてしまいます。
そもそもmod_rewriteはプログラマルな処理には向いていないのですが、一時変数としてApacheの環境変数を利用することで可読性を上げることができますので、記載例を紹介します。
例
例①:スマートフォンまたはFacebookクローラからのアクセスである場合は、それぞれ表示するロゴや適用するCSSを変更する
RewriteEngine on
RewriteRule .* - [E=X_ACCESS_DEVICE:NULL]
RewriteCond %{ENV:X_ACCESS_DEVICE} ^NULL$
RewriteCond %{HTTP_USER_AGENT} Android [NC]
RewriteRule .* - [E=X_ACCESS_DEVICE:SMARTPHONE]
RewriteCond %{ENV:X_ACCESS_DEVICE} ^NULL$
RewriteCond %{HTTP_USER_AGENT} iPhone [NC,OR]
RewriteCond %{HTTP_USER_AGENT} iPod [NC]
RewriteRule .* - [E=X_ACCESS_DEVICE:SMARTPHONE]
RewriteCond %{ENV:X_ACCESS_DEVICE} ^NULL$
RewriteCond %{HTTP_USER_AGENT} facebookexternalhit
RewriteRule .* - [E=X_ACCESS_DEVICE:FACEBOOK]
...
RewriteCond %{ENV:X_ACCESS_DEVICE} ^SMARTPHONE$
RewriteRule ^img/logo\.png /img/logo_sp.png [L]
RewriteCond %{ENV:X_ACCESS_DEVICE} ^FACEBOOK$
RewriteRule ^img/logo\.png /img/logo_fb.png [L]
RewriteCond %{ENV:X_ACCESS_DEVICE} ^SMARTPHONE$
RewriteRule ^css/common\.css /css/common_sp.css [L]
RewriteCond %{ENV:X_ACCESS_DEVICE} ^FACEBOOK$
RewriteRule ^css/common\.css /css/common_fb.css [L]
上記の例では、環境変数 X_ACCESS_DEVICE
を一時変数として利用しています。
この例ではそれほど環境変数を利用する恩恵はないかもしれませんが、例えばユーザエージェントにより様々なコンテンツを表示しわけるといった場合、ユーザエージェントの判定を一箇所にまとめることが出来ます。
※環境変数名の頭に X_
を付与してるのは、Apache標準の環境変数でなくサードパーティの開発者が設定した環境変数であることを明示する作法です。
FacebookクローラはFacebookでURLをシェアした際に対象サイトのURLアクセスしてくるので、OGP対応として専用の画像やCSSを適用する場合は上記のようにに対応が可能です(OGP対応についてはまた別のエントリで紹介します)。
例②:静的リソースに対するアクセスの場合は、ローカルサーバに無い画像をAmazon S3 から取得する(リバースプロキシ)
RewriteEngine on
RewriteRule .* - [E=X_IS_STATIC_CONTENT:0]
RewriteCond %{REQUEST_URI} ([^\]+\.css)$ [OR]
RewriteCond %{REQUEST_URI} ([^\]+\.js)$ [OR]
RewriteCond %{REQUEST_URI} ([^\]+\.html)$ [OR]
RewriteCond %{REQUEST_URI} ([^\]+\.json)$ [OR]
RewriteCond %{REQUEST_URI} ([^\]+\.csv)$
RewriteRule .* - [E=X_IS_STATIC_CONTENT:1,E=X_STATIC_FILE_NAME:%1]
RewriteCond %{ENV:X_IS_STATIC_CONTENT} ^1$
RewriteCond %{DOCUMENT_ROOT}/resource/%{ENV:X_STATIC_FILE_NAME} !-f
RewriteRule ^resource/(.+)$ http://hoge.s3-website-ap-southeast-1.amazonaws.com/resource/$1 [P,L]
※最終行について、httpd.confに記載する場合は ^/resource/.. のように頭に / が必要です。
上記の例では、環境変数 X_IS_STATIC_CONTENT
および X_STATIC_FILE_NAME
を一時変数として利用しています。
ローカルサーバに画像が存在すればその画像を、存在しなければ S3 から画像を取得(リバースプロキシ)します。
mod_rewriteでのプロキシについては、また別のエントリで紹介します。
参考URL
ほか
サンプルの動作検証があまり十分でないので^^; 動かないなどありましたらコメントください。