プロが教える店舗&オフィスのセキュリティ対策術

以下の .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/)

という具合に振分転送させたいのですが・・・。

--------------------------------------
#携帯振り分け
Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !^/mobile
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 ^(.*)$ /mobile/$1 [R,L]

#「www」ありに統一
RewriteCond %{HTTP_HOST} ^(hoge\.jp)(:80)? [NC]
RewriteRule ^(.*)$ http://www.hoge.jp/ [R=301,L]

A 回答 (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/ [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/ [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]

で、どうでしょう?

この回答への補足

ありがとうございます!! ドメインとディレクトリ名の
部分を書き換えたら、ほぼそのままでちゃんと動きました。
(/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/wwwhttp://m.hoge.jp/m 等は内部用の
構成ですので、直接見せたくなく、このURLへダイレクトに
リクエストがあったときは、404エラーを出したいのですが、
これはどう書き加えれば良いでしょうか?

要するに、http://www.hoge.jp/www/abc.html ではなく、
http://www.hoge.jp/abc.html でアクセスさせたいので、
リクエストURIのホスト名以外の部分で、/www/つきのリクエスト
が来たときは、「そんなページない」と言いたいのですが・・・。

補足日時:2009/08/27 11:56
    • good
    • 0

>なにか粗品でも送りたいですが・・・。


ポイントをいただけると、努力した苦労が報われそうです(笑)
    • good
    • 0
この回答へのお礼

ああ、すいません。少し様子を見ていました。
では、締切させていただきますね。
ほんとにポイントだけでいいのかという気持ちですが・・・。

本当にありがとうございました。
ソース活用させていただきます。

お礼日時:2009/08/29 17:38

~略~


RewriteRule ^(.*)$ http://www.hoge.jp/ [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.テスト不足ですので、予定通りの動きであるか必ず確認してください


で、どうでしょう?(ハァハァ、疲れた)
    • good
    • 0
この回答へのお礼

ありがとうございます!!!!(お礼が遅くなってすいません)
ここまでやってもらえると、なにか粗品でも送りたいですが・・・。

フラグを持たせることなんてできるんですね。
このソースはいろんな人の参考になるんじゃないかと思います。
また、実際に動かしてみることで、とても勉強になりました!
本当にどうもありがとうございました!!

お礼日時:2009/08/28 19:03

#ホスト名が違う場合、正しいホスト名でリダイレクト


RewriteCond %{HTTP_HOST} ^hoge.jp$ [OR]
RewriteCond %{HTTP_HOST} ^m.hoge.jp$
RewriteRule ^(.*)$ http://www.hoge.jp/ [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/ [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/ [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/」ディレクトリを参照します。

これを実現したいのですが、どういうコードになりますでしょうか。
うまく言えてなかったらすいません。

補足日時:2009/08/26 00:07
    • good
    • 0

>​

http://m.hoge.jp​ へ転送するには、どう記述を変えれば良いのでしょうか?

>RewriteRule ^(.*)$ /mobile/$1 [R,L]

RewriteRule ^(.*)$ http://m.hoge.jp/ [R=301,L]
かな

この回答への補足

ありがとうございます。

ただ、http://m.hoge.jp へアクセスしたときに、
/home/m のディレクトリの読みに行くようなコードも、
うちのサーバの場合 .htaccess に書かなくてはいけないんですが、
それはどう書けば良いでしょうか?

http://www.hoge.jp へのアクセスも同じで、
/home/www を読みに行くようにコードを書かなければ
いけないのですが、どう書けばいいのかと困っております。

要するに、ブラウザの表示上は、http://www.hoge.jp
となっているが、内部的には、/home/www を読んでいる
状態にしたく、振分ルールと同時にそれも記述する必要が
あるのですが・・・。

補足日時:2009/08/24 12:46
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!