mod_rewriteを使って携帯電話とかモバイルからのアクセスをリダイレクトさせる

Apachemod_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) 

auのユーザエージェント

404 Not Found
例:

KDDI-SA31 UP.Browser/6.2.0.7.3.129 (GUI) MMP/2.0

J-PHONEVodafoneSoftBank


例:

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-ではじまるみたい。

iPhoneiPod 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-AgentMozilla/3.0(DDIPOCKET:メーカ/機種名/機種バージョン/搭載ブラウザバージョン/キャッシュ)ベースブラウザ
または、
User-AgentMozilla/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にディレクトリを指定する場合には最後にスラッシュ(/)をつけるべきなんだねー。