- ベストアンサー
htaccessでPCと携帯の振り分け方法とアドバイス
- htaccessを使ったパソコンと携帯の振り分け方法について説明します。
- 「RewriteEngine on」と「RewriteEngine off」を使ってパソコンと携帯を振り分ける方法について考えます。
- 動的アドレスを静的に変更しながらPCと携帯の振り分けを行うための記述方法についてアドバイスをお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
出勤前なのでちょっとだけ、、 もしhttpd.confもいじれるのなら RewriteLog logs/rew_log RewriteLogLevel 3 を追記すると そのあたりの処理も記録されます http://www.net-newbie.com/trans/mod_rewrite.html#RewriteLog
その他の回答 (4)
- umasikajiro
- ベストアンサー率67% (545/803)
#3の訂正 携帯/PC振り分けの RewriteRule部分 RewriteRule ^.*$ /mobile/ [R] # ↑上の条件 :(!^/mobile) and (携帯電話) の場合に適用 # ここだけはリダイレクトさせないと、その先へ行くときにまずいですね ^.*$ http://hoge.example.com/mobile/ でもいいです もっと下の RewriteCond %{REQUEST_URI} ^/mobile <=この行は 有っても良いですが不要ですね RewriteRule ^mobile/([0-9a-zA-Z_\-]+) とRewriteRuleで指定してあるので
- umasikajiro
- ベストアンサー率67% (545/803)
うちのサーバー(Fedora5 Linux+Apache2.2.2)では以下で出来たみたいです /home/tarou/www/.htaccess に mobileディレクトリ用 .htaccessの記述も統合しました (単に個人的に 私にはその方が判り易いってことです) RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !^/mobile RewriteRule ^([0-9a-zA-Z_\-]+)/review/([0-9a-zA-Z_\-]+).html$ /shop/index.cgi?type=$1&mode=goods&id=$2 [L] # ↑上の条件:(!-f )and (!^/mobile) and(RewriteRuleにマッチ)の場合に適用 RewriteCond %{REQUEST_URI} !^/mobile RewriteRule ^([0-9a-zA-Z_\-]+)/([0-9a-zA-Z_\-]+)/([0-9a-zA-Z_\-]+).html$ /shop/index.cgi?type=$1&mode=goods&id=$2 [L] # ↑上の条件: (!^/mobile) and(RewriteRuleにマッチ)の場合に適用 RewriteCond %{REQUEST_URI} !^/mobile #PCと携帯の振り分け RewriteCond %{HTTP_USER_AGENT} ^DoCoMo [NC,OR] ~中略~ RewriteCond %{HTTP_USER_AGENT} ^DDIPOCKET [NC] RewriteRule ^.*$ /mobile/ # ↑上の条件 :(!^/mobile) and (携帯電話) の場合に適用 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} ^/mobile RewriteRule ^mobile/([0-9a-zA-Z_\-]+)/([0-9a-zA-Z_\-]+).html$ /mobile/shop/index.cgi?type=$1&mode=goods&id=$2 [L] # ↑上の条件 : ( !-f ) and ( mobile/以下のディレクトリ ) and ( RewriteRuleにマッチ )の時に適用 ###############以上です########### 解説: RewriteCond 条件1 # <=andになる RewriteCond 条件2 # RewriteRule ^/index\.htm$ /yes.htm # 条件1、条件2、RewriteRule の3つが一致した時に実行される RewriteRule ^/index\.htm$ /no.htm # 条件1、2のどちらかでも一致していないがRewriteRule には合う場合に実行される http://www.nurs.or.jp/~sug/homep/rewrite/rewrite1.htm <=RewriteCond の項目をお読みください それから RewriteRule ^([0-9a-zA-Z_\-]+)/([0-9a-zA-Z_\-]+)/([0-9a-zA-Z_\-]+).html$ http://hoge.example.com/shop/cgi/index.cgi.cgi?t=$1以下略 とhttp:// から始まるフルURLで書いた場合 同じサーバー内でもリダイレクトするはずなので http://hoge.example.com/shop/cgi/index.cgi.cgi?t=1&c=2&k=3 に対して http://hoge.example.com/1/2/3.html と言うリンクでアクセスすることは出来ますが ブラウザのURL欄には 動的アドレスが表示されてしまうと思います RewriteRule ^([0-9a-zA-Z_\-]+)/([0-9a-zA-Z_\-]+)/([0-9a-zA-Z_\-]+).html$ /shop/index.cgi?t=$1 以下略 だとブラウザのURL欄も http://hoge.example.com/1/2/3.html のままだと思います (と言うか私の環境ではそうなりました)
- umasikajiro
- ベストアンサー率67% (545/803)
>mobileディレクトリ以下の全てのディレクトリも自動的に適応外になるのでしょうか。 そうだと思います。 としか私には答えられませんが サブディレクトリでの変換後も REQUEST_URI は /mobile から始まりますか? http://hoge.example.com/mobile/01.htm ならいいはずですが http://hoge.example.com/0/mobile01.htm に変換されるとtopディレクトリの指定で http://hoge.example.com/mobile/ に再変換されると思います。 その辺りの話は http://www.nurs.or.jp/~sug/homep/rewrite/rewrite15.htm#sec3 に書いてあるようです それでも駄目なら 宜しければ補足に topディレクトリのと mobileディレクトリ の2つの.htaccess の内容を貼り付けてみてください (固有名詞が含まれる場合は 伏字か hoge などで)
補足
ご回答ありがとうございます。 ◆トップディレクトリのhtaccess AddType text/x-server-parsed-html .html RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !^/mobile RewriteRule ^([0-9a-zA-Z_\-]+)/review/([0-9a-zA-Z_\-]+).html$ http://www.hogehoge.com/shop/cgi/index.cgi.cgi?type=$1&mode=rev&id=$2 [L] RewriteRule ^([0-9a-zA-Z_\-]+)/([0-9a-zA-Z_\-]+)/([0-9a-zA-Z_\-]+).html$ http://www.hogehoge.com/shop/cgi/index.cgi.cgi?type=$1&cate=$2&kai=$3 [L] #PCと携帯の振り分け RewriteCond %{HTTP_USER_AGENT} ^DoCoMo [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^J-PHONE [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^vodafone [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^softbank [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^KDDI [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^UP.Browser [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^WILLCOM [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^MOT [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^ASTEL [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^DDIPOCKET [NC] RewriteRule ^.*$ http://www.hogehoge.com/mobile/ [L] ◆mobileディレクトリのhtaccess RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([0-9a-zA-Z_\-]+)/([0-9a-zA-Z_\-]+).html$ http://www.hogehoge.com/mobile/shop/index.cgi?type=$1&mode=goods&id=$2 [L] 携帯は下記のように動的から静的に変換されます。 http://www.hogehoge.com/mobile/shop/index.cgi?type=book&mode=goods&id=1001 ↓ http://www.hogehoge.com/mobile/book/1001.html 自分でもいろいろと調べているのですが、解決策が見つかりません。 お手数をおかけして申し訳ありませんが、アドバイスを頂けると嬉しく思います。 よろしくお願い致します。
- umasikajiro
- ベストアンサー率67% (545/803)
RewriteEngine Off にする意味は ループを避けるためでしょうか? RewriteCondは複数行書くと(明示的にorを指定しない限り)and条件になることはご存知ですよね? RewriteEngine On RewriteCond %{REQUEST_URI} !^/mobile RewriteCond %{HTTP_USER_AGENT} ^DoCoMo [NC,OR] 中略(他の携帯指定) RewriteRule 以下略 とすれば/mobile に RewriteEngine Off を書かなくてもすむのでは? 勘違いしてたらゴメンなさいです。
お礼
ご回答ありがとうございます。 振り分けについてですが、「RewriteCond %{HTTP_USER_AGENT} ^DoCoMo [NC,OR]」のようにORを指定しております。 あと、「RewriteCond %{REQUEST_URI} !^/mobile」を付け加えてみました。 この記述は、「mobile」ディレクトリは適応外にすると言う意味ですよね? トップページにアクセスしたら、携帯サイトのトップを表示させる事ができました。(http://www.hogehoge.com/mobile/) ですが、携帯サイトのトップページのリンクをクリックしても、携帯サイトのトップページしか表示されません。 「RewriteCond %{REQUEST_URI} !^/mobile」は、mobileディレクトリ以下の全てのディレクトリも自動的に適応外になるのでしょうか。 何とも手詰まりな状態です。 自分でももう少し調べてみようと思いますが、引き続きアドバイスをお願い致します。
補足
ご回答ありがとうございます。 う~ん、上手く行かないです。 パソコン用のアドレスは動的から静的に変換されます。 ですが、パソコンと携帯の振り分けがなぜかうまく動作しません。 (!^/mobile) and(RewriteRuleにマッチ)の場合の RewriteRule ^([0-9a-zA-Z_\-]+)/([0-9a-zA-Z_\-]+)/([0-9a-zA-Z_\-]+).html$ /shop/index.cgi?type=$1&mode=goods&id=$2 [L] 上記は、下記の間違いでしょうか? RewriteRule ^([0-9a-zA-Z_\-]+)/review/([0-9a-zA-Z_\-]+).html$ /shop/index.cgi?type=$1&mode=goods&id=$2 [L] パソコン用のURLの書き換えは、少し試したところ問題はなかったから、このままで良いのかな(ー_ー; 記述には特に問題はない気がするのですが、なぜパソコンと携帯で上手く振り分けができないのか分かりません。 あと、直接携帯の静的アドレスにアクセスした場合、404エラーで上手くアクセスできません。 例:http://www.hogehoge.com//mobile/shop/index.cgi?type=book&mode=goods&id=1001 ↓ http://www.hogehoge.com/mobile/book/1001.html 少し凝った事をしようとすると、いろいろと難しいですね。 お手数をおかけしますが、アドバイスをお願い致します。 ############################### RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !^/mobile RewriteRule ^([0-9a-zA-Z_\-]+)/review/([0-9a-zA-Z_\-]+).html$ /shop/index.cgi?type=$1&mode=goods&id=$2 [L] # ↑上の条件:(!-f )and (!^/mobile) and(RewriteRuleにマッチ)の場合に適用 RewriteCond %{REQUEST_URI} !^/mobile RewriteRule ^([0-9a-zA-Z_\-]+)/([0-9a-zA-Z_\-]+)/([0-9a-zA-Z_\-]+).html$ /shop/index.cgi?type=$1&mode=goods&id=$2 [L] # ↑上の条件: (!^/mobile) and(RewriteRuleにマッチ)の場合に適用 RewriteCond %{REQUEST_URI} !^/mobile #PCと携帯の振り分け RewriteCond %{HTTP_USER_AGENT} ^DoCoMo [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^J-PHONE [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^vodafone [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^softbank [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^KDDI [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^UP.Browser [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^WILLCOM [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^MOT [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^ASTEL [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^DDIPOCKET [NC] RewriteRule ^.*$ /mobile/ [R] # ↑上の条件 :(!^/mobile) and (携帯電話) の場合に適用 RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^mobile/([0-9a-zA-Z_\-]+)/([0-9a-zA-Z_\-]+).html$ /mobile/shop/index.cgi?type=$1&mode=goods&id=$2 [L] # ↑上の条件 : ( !-f ) and ( mobile/以下のディレクトリ ) and ( RewriteRuleにマッチ )の時に適用 ###############################