どのURLからもindex.phpを実行する.htaccessにスマホ版用アドレスの振り分けを追加

wordpress

wordpressやZendFrameworkなどCMSで広く使われている手法で、フレンドリーURLを実現する為、どんなアドレスでアクセスがあってもindex.phpを実行させ、プログラムからアクセスしたURLを解析し、パラメーター処理を入れ動的なサイトを表現するのに使われます。

.htaccess

それを実現するため、.htaccessファイルを使います。

今回は、この.htaccessファイルに、更に携帯端末(タッチパネル・スマートフォン)でアクセスがあった場合、専用アドレスへ自動リダイレクトを加えた処理を入れました。
やや複雑になったので忘れないためのメモです。

前置き

wordpressとZendFrameworkの標準型.htaccessファイル

ZendFrameworkで推奨されているデフォルト

Zend_Application クイックスタート
http://framework.zend.com/manual/1.12/ja/zend.application.quick-start.html

SetEnv APPLICATION_ENV development
 
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

WordPressでパーマリンクを設定したときのデフォルト

# BEGIN WordPress

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

# END WordPress

どちらも目的は同じですが
書き方はちょっと違いますね。

結論

今回は目的を果たすため、以下のように書きました。

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_USER_AGENT} (iPhone|Android.*Mobile|Windows.*Phone.iPod) [NC]
RewriteCond %{QUERY_STRING} !mode=pc
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^sp/.*$
RewriteRule ^(.*)$ sp/$1 [R,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(php|js|ico|gif|jpg|png|css|zip|gz|xml|swf|json|mp4|wma|wmv|ini|txt)$ index.php

USER_AGENTから携帯端末情報を取得して、
存在するファイルと、一部例外を入れて/sp/フォルダへリダイレクトを入れています。

この例外をうまくやらないと、画像やCSSなど全部/sp/フォルダへ飛んでいってしまいます。
また/sp/にたどり着いたらもうリダイレクトをしなくていいのでそこも例外処理。

一部例外というのはこの部分で

RewriteCond %{QUERY_STRING} !mode=pc

携帯端末だけど強制的にリダイレクトされるのではなく
意図的にPC版を見たいってときに使うパラメーターです。
リンクの後ろに?mode=pcが付いていると、リダイレクトされずPC版が見れるという動きにします。

余談

ZendFrameworkで推奨されているデフォルトの書き方ですが、個人的にはオススメしません。
この書き方だと、存在しないURL,ファイルがあると全てプログラムが実行してしまいます。
案外と気づかないのが検索エンジンロボットが参照するrobots.txtへのアクセスであったり、
自分では想定していないアクセスが発生していることがあります。

なので、なるべく処理を限定させるため、index.phpの実行は例外、または限定を追加したほうが良いです。

その他参考サイト

調べてるついでにいろんなパターンが一気に書かれているよさげなサイトがあったのでメモ
Htaccess Rewrites – Rewrite Tricks and Tips
このサイトのHtaccessカテゴリにはもっといろんなテクニックが書かれていたけど、難しくてほとんど読めなかった。。

Apache Module mod_rewrite
モジュール mod_rewrite
http://wwwslap.cern.ch/comp/doc/httpd/mod_rewrite-2.3.2/html/

コメント

タイトルとURLをコピーしました