- ベストアンサー
.htaccessの書き方
- http://hoge.jpへの携帯からのアクセスをhttp://hoge.jp/mobileディレクトリへ転送させていますが、http://m.hoge.jpへ転送するにはどう記述を変えれば良いのでしょうか?
- 所定のディレクトリへアクセスさせるには、自分で.htaccessを書く必要があります。(設定画面で設定できません)
- PC・携帯からのhttp://hoge.jpへのアクセスを、それぞれPC:http://www.hoge.jp(/www/)携帯:http://m.hoge.jp(/m/)に振分転送させたいのですが、どうすれば良いですか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
RewriteBase / #「hoge.jp へ来た訪問者は、携帯の場合は m.hoge.jp へ、」 #と #「www.hoge.jp はPCサイトの設置場所であり、携帯の訪問者が #間違ってきたときは、m.hoge.jp へ301リダイレクトします。」 RewriteCond %{HTTP_HOST} ^hoge.jp$ [OR] RewriteCond %{HTTP_HOST} ^www.hoge.jp$ RewriteCond %{HTTP_USER_AGENT} DoCoMo [NC,OR] RewriteCond %{HTTP_USER_AGENT} (J-PHONE|Vodafone|Softbank|MOT-) [NC,OR] RewriteCond %{HTTP_USER_AGENT} (KDDI|UP\.Browser) [NC,OR] RewriteCond %{HTTP_USER_AGENT} (PDXGW|DDIPOKET|WILLCOM) [NC,OR] RewriteCond %{HTTP_USER_AGENT} ASTEL [NC,OR] RewriteCond %{HTTP_USER_AGENT} L-mode [NC] RewriteRule ^(.*)$ http://m.hoge.jp/$1 [R=301,L] #「携帯でない場合は www.hoge.jp に301リダイレクトします。」 #と #「m.hoge.jp は携帯サイトの設置場所であり、携帯でない訪問者が #間違ってきたときは、www.hoge.jp へ301リダイレクトします。」 RewriteCond %{HTTP_HOST} ^hoge.jp$ [OR] RewriteCond %{HTTP_HOST} ^m.hoge.jp$ RewriteCond %{HTTP_USER_AGENT} !DoCoMo [NC] RewriteCond %{HTTP_USER_AGENT} !(J-PHONE|Vodafone|Softbank|MOT-) [NC] RewriteCond %{HTTP_USER_AGENT} !(KDDI|UP\.Browser) [NC] RewriteCond %{HTTP_USER_AGENT} !(PDXGW|DDIPOKET|WILLCOM) [NC] RewriteCond %{HTTP_USER_AGENT} !ASTEL [NC] RewriteCond %{HTTP_USER_AGENT} !L-mode [NC] RewriteRule ^(.*)$ http://www.hoge.jp/$1 [R=301,L] #そして、www.hoge.jp へ転送されてきた訪問者は、ブラウザ #のアドレス欄は、「www.hoge.jp」のままですが、内部的には #「/home/www/」ディレクトリを参照します。 RewriteCond %{HTTP_HOST} ^www.hoge.jp$ RewriteCond %{REQUEST_URI} !^/home/www/.* RewriteRule ^(.*)$ /www/$1 [L] #「同様に、m.hoge.jp へ転送されてきた訪問者は、ブラウザ #のアドレス欄は、「m.hoge.jp」のままですが、内部的には #「/home/m/」ディレクトリを参照します。」 RewriteCond %{HTTP_HOST} ^m.hoge.jp$ RewriteCond %{REQUEST_URI} !^/home/m/.* RewriteRule ^(.*)$ /m/$1 [L] で、どうでしょう?
その他の回答 (4)
>なにか粗品でも送りたいですが・・・。 ポイントをいただけると、努力した苦労が報われそうです(笑)
お礼
ああ、すいません。少し様子を見ていました。 では、締切させていただきますね。 ほんとにポイントだけでいいのかという気持ちですが・・・。 本当にありがとうございました。 ソース活用させていただきます。
~略~ RewriteRule ^(.*)$ http://www.hoge.jp/$1 [R=301,L] 以下から変更&追加 #そして、www.hoge.jp へ転送されてきた訪問者は、ブラウザ #のアドレス欄は、「www.hoge.jp」のままですが、内部的には #「/www/」ディレクトリを参照します。 RewriteCond %{HTTP_HOST} ^www.hoge.jp$ RewriteCond %{REQUEST_URI} !^/www/.* RewriteRule ^(.*)$ /www/$1\?REWRITED=TRUE [L,QSA] #「同様に、m.hoge.jp へ転送されてきた訪問者は、ブラウザ #のアドレス欄は、「m.hoge.jp」のままですが、内部的には #「/m/」ディレクトリを参照します。」 RewriteCond %{HTTP_HOST} ^m.hoge.jp$ RewriteCond %{REQUEST_URI} !^/m/.* RewriteRule ^(.*)$ /m/$1\?REWRITED=TRUE [L,QSA] #「/home/www/ は、直接アクセスできず、 」 RewriteCond %{HTTP_HOST} ^www.hoge.jp$ RewriteCond %{REQUEST_URI} ^/www/.* RewriteCond %{QUERY_STRING} !^.*REWRITED=TRUE.* RewriteRule ^(.*)$ $1 [R=404,L] #「/home/m/ は、直接アクセスできず、」 RewriteCond %{HTTP_HOST} ^m.hoge.jp$ RewriteCond %{REQUEST_URI} ^/m/.* RewriteCond %{QUERY_STRING} !^.*REWRITED=TRUE.* RewriteRule ^(.*)$ $1 [R=404,L] コードは以上 /home/www/.*を直接RewriteCondで比較して、弾いてしまうと、 RewriteRule ^(.*)$ /www/$1 [L] の行で書き換えたURIも弾いてしまい、結果全てのリクエストが404になってしまうので、 RewriteRule ^(.*)$ /www/$1 [L] を RewriteRule ^(.*)$ /www/$1\?REWRITED=TRUE [L,QSA] として、rewriteした場合に、クエリストリングにフラグを持たせ、 このフラグが入っている場合(内部リダイレクト時)は、 /home/www/*. を参照できるようにしました ただし、下記の件を検討してください 1.http://www.hoge.jp/www/index.html?REWRITED=TRUE と、ブラウザでフラグをつけると見れてしまいます これが、許容できない場合は利用しないで下さい 2.CGI等でREWRITEDをクエリで取得している場合は、別の文字列に変更してください 3.テスト不足ですので、予定通りの動きであるか必ず確認してください で、どうでしょう?(ハァハァ、疲れた)
お礼
ありがとうございます!!!!(お礼が遅くなってすいません) ここまでやってもらえると、なにか粗品でも送りたいですが・・・。 フラグを持たせることなんてできるんですね。 このソースはいろんな人の参考になるんじゃないかと思います。 また、実際に動かしてみることで、とても勉強になりました! 本当にどうもありがとうございました!!
#ホスト名が違う場合、正しいホスト名でリダイレクト RewriteCond %{HTTP_HOST} ^hoge.jp$ [OR] RewriteCond %{HTTP_HOST} ^m.hoge.jp$ RewriteRule ^(.*)$ http://www.hoge.jp/$1 [R=301,L] #携帯かつURIが/m/から始まっていない場合、/m/へリダイレクト RewriteCond %{REQUEST_URI} !^/m/.* RewriteCond %{HTTP_USER_AGENT} DoCoMo [NC,OR] RewriteCond %{HTTP_USER_AGENT} (J-PHONE|Vodafone|Softbank|MOT-) [NC,OR] RewriteCond %{HTTP_USER_AGENT} (KDDI|UP\.Browser) [NC,OR] RewriteCond %{HTTP_USER_AGENT} (PDXGW|DDIPOKET|WILLCOM) [NC,OR] RewriteCond %{HTTP_USER_AGENT} ASTEL [NC,OR] RewriteCond %{HTTP_USER_AGENT} L-mode [NC] RewriteRule ^(.*)$ http://www.hoge.jp/m/$1 [R=301,L] #携帯ではない場合でURIが/www/で始まっていない場合、/www/へリダイレクト RewriteCond %{REQUEST_URI} !^/www/.* RewriteCond %{HTTP_USER_AGENT} !DoCoMo [NC] RewriteCond %{HTTP_USER_AGENT} !(J-PHONE|Vodafone|Softbank|MOT-) [NC] RewriteCond %{HTTP_USER_AGENT} !(KDDI|UP\.Browser) [NC] RewriteCond %{HTTP_USER_AGENT} !(PDXGW|DDIPOKET|WILLCOM) [NC] RewriteCond %{HTTP_USER_AGENT} !ASTEL [NC] RewriteCond %{HTTP_USER_AGENT} !L-mode [NC] RewriteRule ^(.*)$ http://www.hoge.jp/www/$1 [R=301,L] で、どうでしょうか?
補足
ありがとうございます。すごいです。 ただ、こちらの説明が下手なため、希望の動作には なっていません。お手数ですが、あと一声お願いします。 もう一度詳しく書きます。 ■前提条件 訪問者に見えるホスト名は、 hoge.jp www.hoge.jp m.hoge.jp の3種類があり、それぞれ以下のディレクトリに対応させます。 /home/ /home/www/ /home/m/ このうち、/home/www/ と /home/m/ は、直接アクセスできず、 たとえば、/home/www/index.html へアクセスするには、 http://www.hoge.jp でリクエストを出す必要があります。 同様に、/home/m/index.html へアクセスするには、 http://m.hoge.jp でリクエストを出す必要があります。 ■やりたいこと hoge.jp へ来た訪問者は、携帯の場合は m.hoge.jp へ、 携帯でない場合は www.hoge.jp に301リダイレクトします。 www.hoge.jp はPCサイトの設置場所であり、携帯の訪問者が 間違ってきたときは、m.hoge.jp へ301リダイレクトします。 m.hoge.jp は携帯サイトの設置場所であり、携帯でない訪問者が 間違ってきたときは、www.hoge.jp へ301リダイレクトします。 そして、www.hoge.jp へ転送されてきた訪問者は、ブラウザ のアドレス欄は、「www.hoge.jp」のままですが、内部的には 「/home/www/」ディレクトリを参照します。 同様に、m.hoge.jp へ転送されてきた訪問者は、ブラウザ のアドレス欄は、「m.hoge.jp」のままですが、内部的には 「/home/m/」ディレクトリを参照します。 これを実現したいのですが、どういうコードになりますでしょうか。 うまく言えてなかったらすいません。
>http://m.hoge.jp へ転送するには、どう記述を変えれば良いのでしょうか? >RewriteRule ^(.*)$ /mobile/$1 [R,L] を RewriteRule ^(.*)$ http://m.hoge.jp/$1 [R=301,L] かな
補足
ありがとうございます。 ただ、http://m.hoge.jp へアクセスしたときに、 /home/m のディレクトリの読みに行くようなコードも、 うちのサーバの場合 .htaccess に書かなくてはいけないんですが、 それはどう書けば良いでしょうか? http://www.hoge.jp へのアクセスも同じで、 /home/www を読みに行くようにコードを書かなければ いけないのですが、どう書けばいいのかと困っております。 要するに、ブラウザの表示上は、http://www.hoge.jp となっているが、内部的には、/home/www を読んでいる 状態にしたく、振分ルールと同時にそれも記述する必要が あるのですが・・・。
補足
ありがとうございます!! ドメインとディレクトリ名の 部分を書き換えたら、ほぼそのままでちゃんと動きました。 (/home はルートですので、/home/www を /www/ に修正してUP しました。そのディレクトリ名ではなぜか動かなかったので、 ディレクト名を、/www.hoge.jp/ 、/m.hoge.jp/ にして再度修正後 UPしたら、ばっちり希望通りの動作になりました) ホントにありがとうございました。 1点質問があるのですが、http://www.hoge.jp でアクセスしたら、 PC用のディレクトリを、http://m.hoge.jp でアクセスしたら、 携帯用のディレクトリを読みに行く部分ですが、書き換え先の http://www.hoge.jp/www や http://m.hoge.jp/m 等は内部用の 構成ですので、直接見せたくなく、このURLへダイレクトに リクエストがあったときは、404エラーを出したいのですが、 これはどう書き加えれば良いでしょうか? 要するに、http://www.hoge.jp/www/abc.html ではなく、 http://www.hoge.jp/abc.html でアクセスさせたいので、 リクエストURIのホスト名以外の部分で、/www/つきのリクエスト が来たときは、「そんなページない」と言いたいのですが・・・。