.htaccessでスマートフォンとPCサイトを内部的に出し分ける

.htaccessスマートフォンとPCサイトを内部的に出し分けようとして(ユーザーからは同じアドレスを参照)どうしてもリダイレクトされてしまう現象が起きた話

 

 

 今回ルートディレクトリにpc、spのフォルダがある状態。ユーザーからアドレスの変更は見えずに出し分けをする。

(ユーザーはhttp://foobar.com/にアクセスするだけだが、内部的にはPC用にはpcフォルダ内、スマートフォン用にはspフォルダ内を表示している)

 

[.htaccess]
SetEnvIf User-Agent "iPhone" UA=sp
SetEnvIf User-Agent "iPod" UA=sp
SetEnvIf User-Agent "Android" UA=sp
RewriteCond %{REQUEST_URI} ^/(pc|sp)/
RewriteRule .* - [L]
RewriteCond %{ENV:UA} ^sp$
RewriteRule ^(.*)$ sp/$1 [L,NS]

 

ちなみに下記だとなぜかリダイレクトになってしまいます。ここでハマりました。。。

RewriteRule ^$ sp [L,NS]

 

振り分け出来ているかの確認方法

chromeで確認するとchromeが経路を覚えていて変更が更新されない。この為今回はcurlコマンドを使用して確認しました。

 

curlコマンドの主な使用方法

ユーザーエージェントの偽装(iPhone iOS6の場合)

curl -A "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25" http://foo.com

userAgent一覧/ユーザーエージェント一覧

 

リダイレクト先を取得する時

curl -L http://foo.com

 

リファラーの偽装

curl -e http://yahoo.co.jp http://foo.com

*ちなみにリファラーとは、現在のページにアクセスする前にいたページのこと