mod_rewriteを使って携帯電話とかモバイルからのアクセスをリダイレクトさせる
Apacheのmod_rewriteをつかってケータイからアクセスがきたらユーザエージェントを判別して別のサイトへ飛ばす。
よくある設定だけど、まじめに書いたことなかったので調べつつやってみた。
DoCoMoのユーザエージェント
「作ろうiモードコンテンツ」リニューアルのお知らせ | サービス・機能 | NTTドコモ
「作ろうiモードコンテンツ」リニューアルのお知らせ | サービス・機能 | NTTドコモ
例:
DoCoMo/1.0/N501i DoCoMo/1.0/F502i/c10 DoCoMo/1.0/D503i/c10/serNMAIA000001 DoCoMo/2.0 MST_v_SH2101V(c100) DoCoMo/2.0 F2051(c100;TB;serXXXXXXXXXXXXXXX;iccxxxxxxxxxxxxxxxxxxxx) DoCoMo/1.0/D505i/c20/TB/W20H10/serNMAIA000001 DoCoMo/2.0 SO906i(c100;TB;W24H18)
J-PHONE、Vodafone、SoftBank
J-PHONE/2.0/J-SH02 J-PHONE/4.2/V601N[/Serial] N/01000100 Profile/MIDP-1.0 Configuration/CLDC-1.0 Ext-Profile/JSCL-1.1.1 MOT-V980/80.2F.2E. MIB/2.2.1 Profile/MIDP-2.0 Configuration/CLDC-1.1 Vodafone/1.0/V705SH/SHJ001[/Serial] Browser/VF-NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1 SoftBank/1.0/DM002SH/SHJ001[/Serial] Browser/NetFront/3.4 Profile/MIDP-2.0 Configuration/CLDC-1.1
※↑Motorola製3G携帯電話のユーザーエージェントはMOT-ではじまるみたい。
iPhone、iPod touch
iPhone 3G用のWebページを作る1 [Javascript] All About
例:
Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0 like Mac OS X; ja-jp) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5A345 Safari/525.20 Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1C28 Safari/419.3 Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3A100a Safari/419.3 Mozilla/5.0 (iPod; U; CPU iPhone OS 2_0 like Mac OS X; ja-jp) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5A347 Safari/525.20
WILLCOM
※は スペース User-Agent Mozilla/3.0(DDIPOCKET:メーカ/機種名/機種バージョン/搭載ブラウザバージョン/キャッシュ)ベースブラウザ または、 User-Agent Mozilla/3.0(WILLCOM:メーカ/機種名/機種バージョン/搭載ブラウザバージョン/キャッシュ)ベースブラウザ
以上をふまえて.htaccessで設定してみた。
RewriteEngine On RewriteCond %{HTTP_USER_AGENT} DoCoMo [OR] RewriteCond %{HTTP_USER_AGENT} UP\.Browser [OR] RewriteCond %{HTTP_USER_AGENT} J-PHONE [OR] RewriteCond %{HTTP_USER_AGENT} MOT- [OR] RewriteCond %{HTTP_USER_AGENT} Vodafone [OR] RewriteCond %{HTTP_USER_AGENT} SoftBank [OR] RewriteCond %{HTTP_USER_AGENT} iPod [OR] RewriteCond %{HTTP_USER_AGENT} iPhone [OR] RewriteCond %{HTTP_USER_AGENT} DDIPOCKET [OR] RewriteCond %{HTTP_USER_AGENT} WILLCOM # サイト以下全部のディレクトリに対して効かせる RewriteRule (.*) http://redirect.to/mobile/ [R=301,L]
ディレクトリを指定する場合には最後にスラッシュ(/)をつけるべき
mod_rewriteを使って携帯電話とかモバイルからのアクセスをリダイレクトさせる - yuhei.kagayaで、
RewriteRule (.*) http://redirect.to/mobile/ [R=301,L]
とかやった時、ちょっと気になった。
- HTTPステータスコード301と302はどちらも転送だけど、違いは?
- ディレクトリにリクエストするとき、最後にスラッシュ(/)をつけた場合とつけなかった場合は?
HTTPステータスコード301と302はどちらも転送だけど、違いは?
[Studying HTTP] HTTP Status Code
こちらのサイトですべて解決しました。
そのページは移動しましたよ、この先ずっと移動先のURLでブックマーク登録よろしくね。というお引っ越し通知。
あとは、SEO的にもこの引っ越し通知はいいらしい。
また、ロボットのアクセスには、ステータスコード301によってURLが変更されたことがわかります。
Googleなら、引越し前のページにリンクしているリンク元を、引越し先に引き継ぐことができます。
ほぼ、PageRankを引き継げると言えます。
要求されたページは、今は一時的にこのURLにアクセスしてみてほしいけど、将来的には変わるから、
また同じページを見たいときは今回最初に送ってきてくれたURLでアクセスしてね、という通知。
ディレクトリにリクエストするとき、最後にスラッシュ(/)をつけた場合とつけなかった場合は?
つぎの4つの場合のRewriteRule適用を、FireFoxのアドオン、Live HTTP Headers :: Add-ons for Firefoxで監視してみた(リクエストヘッダ、レスポンスヘッダの抜粋)。
# 1:ディレクトリの最後のスラッシュ(/)を指定しない。 RewriteRule (.*) http://redirect.to/mobile [R,L] # 2:ディレクトリの最後のスラッシュ(/)を指定する。 RewriteRule (.*) http://redirect.to/mobile/ [R,L] # 3:ステータスコード301で返して、ディレクトリの最後のスラッシュ(/)を指定しない。 RewriteRule (.*) http://redirect.to/mobile [R=301,L] # 4:ステータスコード301で返して、ディレクトリの最後のスラッシュ(/)を指定する。 RewriteRule (.*) http://redirect.to/mobile/ [R=301,L]
1:ディレクトリの最後のスラッシュ(/)を指定しない。
1【リクエスト】GETする GET / HTTP/1.1 Host: redirect.from ↓ 2【レスポンス】302 Foundが返ってくる HTTP/1.x 302 Found Date: Wed, 15 Oct 2008 05:20:20 GMT Server: Apache Location: http://redirect.to/mobile ↓ 3【リクエスト】指定されたLocation へGETする GET /mobile HTTP/1.1 Host: redirect.to ↓ 4【レスポンス】/mobileはステータス301で移動してるので恒久的に覚えておいてと返ってくる HTTP/1.x 301 Moved Permanently Date: Wed, 15 Oct 2008 05:32:56 GMT Server: Apache Location: http://redirect.to/mobile/ ↓ 5【リクエスト】指定されたLocationへGETする GET /mobile/ HTTP/1.1 Host: redirect.to ↓ 6【レスポンス】リクエストは成功したよ HTTP/1.x 200 OK Date: Wed, 15 Oct 2008 05:32:56 GMT Server: Apache
今回の場合、2はもうこの先ずっとURLは変わらないので301の方がベター。
3、4の通信が無駄。
2:ディレクトリの最後のスラッシュ(/)を指定する。
1【リクエスト】GETする GET / HTTP/1.1 Host: redirect.from ↓ 2【レスポンス】302 Foundが返ってくる HTTP/1.x 302 Found Date: Wed, 15 Oct 2008 05:22:53 GMT Server: Apache Location: http://redirect.to/mobile/ ↓ 3【リクエスト】指定されたLocation へGETする GET /mobile/ HTTP/1.1 Host: redirect.to ↓ 4【レスポンス】リクエストは成功したよ HTTP/1.x 200 OK Date: Wed, 15 Oct 2008 05:35:29 GMT Server: Apache
2の時に、一時的な移動ではないので301を返した方がベター。
3:ステータスコード301で返して、ディレクトリの最後のスラッシュ(/)を指定しない。
1【リクエスト】GETする GET / HTTP/1.1 Host: redirect.from ↓ 2【レスポンス】ステータス301で移動してるので恒久的に覚えておいてと返ってくる HTTP/1.x 301 Moved Permanently Date: Wed, 15 Oct 2008 05:26:05 GMT Server: Apache Location: http://redirect.to/mobile ↓ 3【リクエスト】指定されたLocationへGETする GET /mobile HTTP/1.1 Host: redirect.to ↓ 4【レスポンス】/mobileはステータス301で移動してるので恒久的に覚えておいてと返ってくる HTTP/1.x 301 Moved Permanently Date: Wed, 15 Oct 2008 05:38:41 GMT Server: Apache Location: http://redirect.to/mobile/ ↓ 5【リクエスト】指定されたLocationにたいし、GETする GET /mobile/ HTTP/1.1 Host: redirect.to ↓ 6【レスポンス】リクエストは成功したよ HTTP/1.x 200 OK Date: Wed, 15 Oct 2008 05:38:41 GMT Server: Apache
2、3、4の通信が無駄。
4:ステータスコード301で返して、ディレクトリの最後のスラッシュ(/)を指定する。
1【リクエスト】GETする GET / HTTP/1.1 Host: redirect.from ↓ 2【レスポンス】ステータス301で移動してるので恒久的に覚えておいてと返ってくる HTTP/1.x 301 Moved Permanently Date: Wed, 15 Oct 2008 05:24:54 GMT Server: Apache Location: http://redirect.to/mobile/ ↓ 3【リクエスト】指定されたLocationにたいし、GETする GET /mobile/ HTTP/1.1 Host: redirect.to ↓ 4【レスポンス】リクエストは成功したよ HTTP/1.x 200 OK Date: Wed, 15 Oct 2008 05:37:30 GMT Server: Apache
ということで、HTTPステータスとしても適切だし、無駄な通信がないので(ヘッダの抜粋なのでホントはもっと無駄がある)今回はこれが一番よいことがわかった。
というか、いつもURLにディレクトリを指定する場合には最後にスラッシュ(/)をつけるべきなんだねー。