-PR-
解決済み

.htaccess の書き方

  • 困ってます
  • 質問No.5231810
  • 閲覧数932
  • ありがとう数6
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 65% (184/279)

以下の .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/$1 [R=301,L]
通報する
  • 回答数5
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.3
レベル11

ベストアンサー率 58% (140/241)

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]

で、どうでしょう?
補足コメント
orenge_mint

お礼率 65% (184/279)

ありがとうございます!! ドメインとディレクトリ名の
部分を書き換えたら、ほぼそのままでちゃんと動きました。
(/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:02
関連するQ&A
-PR-
-PR-

その他の回答 (全4件)

  • 回答No.2
レベル11

ベストアンサー率 58% (140/241)

#ホスト名が違う場合、正しいホスト名でリダイレクト RewriteCond %{HTTP_HOST} ^hoge.jp$ [OR] RewriteCond %{HTTP_HOST} ^m.hoge.jp$ RewriteRule ^(.*)$ http://www.hoge.jp/$1 [R=301,L] #携帯かつURIが/m/から始まっていない場合、/m/へリダイレクト RewriteC ...続きを読む
#ホスト名が違う場合、正しいホスト名でリダイレクト
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]

で、どうでしょうか?
補足コメント
orenge_mint

お礼率 65% (184/279)

ありがとうございます。すごいです。
ただ、こちらの説明が下手なため、希望の動作には
なっていません。お手数ですが、あと一声お願いします。

もう一度詳しく書きます。

■前提条件

訪問者に見えるホスト名は、
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:46


  • 回答No.5
レベル11

ベストアンサー率 58% (140/241)

>なにか粗品でも送りたいですが・・・。 ポイントをいただけると、努力した苦労が報われそうです(笑) ...続きを読む
>なにか粗品でも送りたいですが・・・。
ポイントをいただけると、努力した苦労が報われそうです(笑)
お礼コメント
orenge_mint

お礼率 65% (184/279)

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

本当にありがとうございました。
ソース活用させていただきます。
投稿日時 - 2009-08-29 17:38:28
  • 回答No.1
レベル11

ベストアンサー率 58% (140/241)

>​http://m.hoge.jp​ へ転送するには、どう記述を変えれば良いのでしょうか? >RewriteRule ^(.*)$ /mobile/$1 [R,L] を RewriteRule ^(.*)$ http://m.hoge.jp/$1 [R=301,L] かな ...続きを読む
>​http://m.hoge.jp​ へ転送するには、どう記述を変えれば良いのでしょうか?

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

RewriteRule ^(.*)$ http://m.hoge.jp/$1 [R=301,L]
かな
補足コメント
orenge_mint

お礼率 65% (184/279)

ありがとうございます。

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

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

要するに、ブラウザの表示上は、http://www.hoge.jp
となっているが、内部的には、/home/www を読んでいる
状態にしたく、振分ルールと同時にそれも記述する必要が
あるのですが・・・。
投稿日時 - 2009-08-24 12:46:55
  • 回答No.4
レベル11

ベストアンサー率 58% (140/241)

~略~ RewriteRule ^(.*)$ http://www.hoge.jp/$1 [R=301,L] 以下から変更&追加 #そして、www.hoge.jp へ転送されてきた訪問者は、ブラウザ #のアドレス欄は、「www.hoge.jp」のままですが、内部的には #「/www/」ディレクトリを参照します。 RewriteCond %{HTTP_HOST} ^www.hoge.jp ...続きを読む
~略~
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.テスト不足ですので、予定通りの動きであるか必ず確認してください


で、どうでしょう?(ハァハァ、疲れた)
お礼コメント
orenge_mint

お礼率 65% (184/279)

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

フラグを持たせることなんてできるんですね。
このソースはいろんな人の参考になるんじゃないかと思います。
また、実際に動かしてみることで、とても勉強になりました!
本当にどうもありがとうございました!!
投稿日時 - 2009-08-28 19:03:56
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
-PR-
-PR-
このQ&Aにこう思った!同じようなことあった!感想や体験を書こう
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


新大学生・新社会人のパソコンの悩みを解決!

いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ