携帯電話とデスクトップのURL振り分け
まだ地道に移転作業を続けていたりする。
昨日は携帯電話でのアクセスに対応するべく、.htaccessの編集を行う。
.htaccessはディレクトリ単位で様々な設定をすることが出来る優れもの。
ただし、レンタルサーバによってサポートしているところと居ないところがある。
SereneBachには携帯電話での閲覧モードが用意されている。
ここでRewrite(URLの書き換え)の機能を使って、デスクトップと携帯電話で同じURLで閲覧が出来るように改造をする。
Rewriteを利用するためにはまず、
RewriteEngine On
と宣言をする必要がある。
Rewite機能がインストールされていないサーバでは動かないので注意が必要。
通常のデスクトップ用のURLは
http://www.usachanpeace.com/
携帯用のURLは
http://www.usachanpaace.com/mb.cgi
だ。
ちなみに、
http://www.usachanpeace.com/sb.cgi
だと、携帯とデスクトップを自動で判別して振り分けてくれる。
だから、トップページをmb.cgiにすればいいのだが、それは流石に不便だろう。
携帯電話かどうかの判断はUser-Agentを調べれば分かる。
そこで、.htaccessに
RewriteCond %{HTTP_USER_AGENT} DoCoMo
RewriteRule ^$ /mb.cgi [R]RewriteCond %{HTTP_USER_AGENT} J-PHONE
RewriteRule ^$ /mb.cgi [R]RewriteCond %{HTTP_USER_AGENT} Vodafone
RewriteRule ^$ /mb.cgi [R]
RewriteCond %{HTTP_USER_AGENT} UP.Browser
RewriteRule ^$ /mb.cgi [R]
を追加する。
RewriteCondとは書き換えをする条件を指定する箇所。
ここだと、「HTTP_USER_AGENT」に「DoCoMo」という文字列を含んでいる時という意味となる。
判定文には正規表現で指定する。正規表現に関してはWebに関わっていると必ず出現するものなので、勉強しておいて損はない。
RewriteCondで指定できる項目は
- HTTP_USER_AGENT
- HTTP_REFERER
- HTTP_COOKIE
- HTTP_FORWARDED
- HTTP_HOST
- HTTP_PROXY_CONNECTION
- HTTP_ACCEPT
- REMOTE_ADDR
- REMOTE_HOST
- REMOTE_USER
- REMOTE_IDENT
- REQUEST_METHOD
- SCRIPT_FILENAME
- PATH_INFO
- QUERY_STRING
- AUTH_TYPE
- DOCUMENT_ROOT
- SERVER_ADMIN
- SERVER_NAME
- SERVER_ADDR
- SERVER_PORT
- SERVER_PROTOCOL
- SERVER_SOFTWARE
- TIME_YEAR
- TIME_MON
- TIME_DAY
- TIME_HOUR
- TIME_MIN
- TIME_SEC
- TIME_WDAY
- TIME
- API_VERSION
- THE_REQUEST
- REQUEST_URI
- REQUEST_FILENAME
- IS_SUBREQ
- HTTPS
といった項目があるようだ。
それぞれの内容に関してはgoogle検索すればわかるだろう。
RewriteCondの条件にマッチするとRewriteRuleで書き換えを行う。
ここも正規表現で指定する。
「^$」は^=文頭、$=文末を表すので、つまり空を表す。
ホスト名を除いたアクセス先が空というは、つまり
「http://www.usachanpeace.com/」のことをさす。
(ホスト名がhttp://www.usachanpeace.com/)
その空の部分を「/mb.cgi」に置換をすると指定している。
つまり、http://www.usachanpeace.com/が
http://www.usachanpeace.com/mb.cgiに置換することになる。
([R]はこの置換が転送である事を示す。HTTPで返すコードが302にかわる。)
まとめると、
RewriteCond %{HTTP_USER_AGENT} DoCoMo
RewriteRule ^$ /mb.cgi [R]
は、
環境変数HTTP_USER_AGENTにDoCoMoが含まれていたら、
空行を「/mb.cgi」に置換せよ、という事になる。
他の携帯電話に対しても同様の処理を行う。
これで携帯電話からのアクセスは全てmb.cgiに飛ばされる。
次に必要なのは各記事への対応だ。
すべてのエントリは
http://www.usachanpeace.com/sayumipeace/eidXXX.html
という形でHTMLとして保存されている。
それぞれのエントリを携帯電話でみるためには
http://www.usachanpeace.com/mb.cgi?eid=XXX
と指定すればいい。(XXXは記事ID)
コレを実現するには
RewriteCond %{HTTP_USER_AGENT} DoCoMo
RewriteCond %{REQUEST_FILENAME} sayumipeace/eid
RewriteRule sayumipeace/eid([0-9]+)\.html$ /mb.cgi?eid=$1 [R]
と指定する。
RewriteCondは条件を重ねて指定することが出来る。
特に指定しなければそれぞれの条件分はANDとなる。
ORを指定したければ、[or]を行末に加える。
RewriteCond %{REQUEST_FILENAME} sayumipeace/eid
はリクエストしたファイルの名前にsayumipeace/eidが含まれていたら、
という条件となる。
RewriteRule sayumipeace/eid([0-9]+)\.html$ /mb.cgi?eid=$1 [R]
これは、リクエストURLのうち、「sayumipeace/eid([0-9]+)\.html」でマッチする箇所を
「/mb.cgi?eid=$1」で置換しろということだ。
eid([0-9]+)の箇所は、0から9までの数字の繰り返しで構成されている事を示し、
()で括った箇所は置換のときに$1として参照が出来る。
「\.」は拡張子を表す区切りの「.」は正規表現での予約語なので、
直前に\を加える事で「.」は文字ですよ、と教えてあげる。
例えば、「sayumipeace/eid581.html」は581の部分が0から9までの数字の繰り返しなのでマッチして、\1=581となる。
従って、
「http://www.usachanpeace.com/sayumipeace/eid581.html」は
「http://www.usachanpeace.com/mb/cgi?eid=581」に置換される。
「sayumipeace/eid581abc.html」等はマッチしない。
以上のことをまとめて.htaccessを作成すると、
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} DoCoMo
RewriteCond %{REQUEST_FILENAME} sayumipeace/eid
RewriteRule sayumipeace/eid([0-9]+)\.html$ /mb.cgi?eid=$1 [R]RewriteCond %{HTTP_USER_AGENT} J-PHONE
RewriteCond %{REQUEST_FILENAME} sayumipeace/eid
RewriteRule sayumipeace/eid([0-9]+)\.html$ /mb.cgi?eid=$1 [R]RewriteCond %{HTTP_USER_AGENT} Vodafone
RewriteCond %{REQUEST_FILENAME} sayumipeace/eid
RewriteRule sayumipeace/eid([0-9]+)\.html$ /mb.cgi?eid=$1 [R]RewriteCond %{HTTP_USER_AGENT} UP.Browser
RewriteCond %{REQUEST_FILENAME} sayumipeace/eid
RewriteRule sayumipeace/eid([0-9]+)\.html$ /mb.cgi?eid=$1 [R]RewriteCond %{HTTP_USER_AGENT} DoCoMo
RewriteRule ^$ /mb.cgi [R]RewriteCond %{HTTP_USER_AGENT} J-PHONE
RewriteRule ^$ /mb.cgi [R]RewriteCond %{HTTP_USER_AGENT} Vodafone
RewriteRule ^$ /mb.cgi [R]
RewriteCond %{HTTP_USER_AGENT} UP.Browser
RewriteRule ^$ /mb.cgi [R]
となる。
とまぁ、いかにも知ったかぶりで書いたけど、
これらの事は今回の移転で調べて行った事だからそれほど詳しいわけではない。
これは自分への備忘録だな。