現在ある特定のPCのページから携帯を振り分けたい。


ある特定のページと同じ階層内には複数のページがあります。
この特定の1ページだけを、携帯からのアクセスを他ページに移動させたいと考えています。

特定のページを携帯用に作り替え、
javascriptを使う方法も考えましたが↓

if(navigator.appCodeName=="Mozilla"){
location.href="pc.html.";
}

出来れば現在のPC用のURL、リンクを変更したくはありません。

同じ階層には複数のページがあるため、
.htaccess による振り分けも私の知識ではうまくいきません。

現在のページにアクセスした携帯を振り分ける、
何かいい方法がありましたらお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2009/08/20 11:37:53
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:rouge_2008 No.1

回答回数595ベストアンサー獲得回数351

ポイント100pt

「.htaccess」は使用できるのですね?

例えば、「http://user.example.com/」がtontonpokopokoさんのHPアドレス、ある特定のPC用ページが「http://user.example.com/pc.html」、携帯に表示させたいページが「http://user.example.com/mobile.html」だとして、次のように記述してみてください。

※以下は、WEBルート直下に「.htaccess」を置く場合です。

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_USER_AGENT} ^(DoCoMo|KDDI|DDIPOKET|UP\.Browser|J-PHONE|Vodafone|SoftBank)
RewriteRule ^pc\.html http://user.example.com/mobile.html [R]


※ある特定のPC用ページが「http://user.example.com/dir1/pc.html」の場合は、RewriteRuleの行は次のようになります。

RewriteRule ^dir1/pc\.html http://user.example.com/mobile.html [R]

※PC用のページのファイルまでのパスは、ルート直下に置いてあるファイルからの相対パスを、携帯に表示させるページはそのページのURLをそのまま書くと分かり易いと思います。

※「.htaccess」をルート直下以外の場所に置く場合は、「RewriteBase」も変更する必要がありますし、「RewriteRule」のファイルまでのパスも「.htaccess」を置いた場所からの相対パスに変更する必要があります。


http://note.stb.main.jp/?eid=623064

http://sugoudemarketer.net/2009/04/htaccess.html

id:tontonpokopoko

rouge_2008さん、ありがとうございます。

まだ試してはないのですが、

この方法だと、.htaccess以下の階層(特定のページ以外にも)にきた、すべて携帯ユーザを特定のページに飛ばすことにはならないでしょうか・・?

2009/08/18 11:41:52

その他の回答1件)

id:rouge_2008 No.1

回答回数595ベストアンサー獲得回数351ここでベストアンサー

ポイント100pt

「.htaccess」は使用できるのですね?

例えば、「http://user.example.com/」がtontonpokopokoさんのHPアドレス、ある特定のPC用ページが「http://user.example.com/pc.html」、携帯に表示させたいページが「http://user.example.com/mobile.html」だとして、次のように記述してみてください。

※以下は、WEBルート直下に「.htaccess」を置く場合です。

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_USER_AGENT} ^(DoCoMo|KDDI|DDIPOKET|UP\.Browser|J-PHONE|Vodafone|SoftBank)
RewriteRule ^pc\.html http://user.example.com/mobile.html [R]


※ある特定のPC用ページが「http://user.example.com/dir1/pc.html」の場合は、RewriteRuleの行は次のようになります。

RewriteRule ^dir1/pc\.html http://user.example.com/mobile.html [R]

※PC用のページのファイルまでのパスは、ルート直下に置いてあるファイルからの相対パスを、携帯に表示させるページはそのページのURLをそのまま書くと分かり易いと思います。

※「.htaccess」をルート直下以外の場所に置く場合は、「RewriteBase」も変更する必要がありますし、「RewriteRule」のファイルまでのパスも「.htaccess」を置いた場所からの相対パスに変更する必要があります。


http://note.stb.main.jp/?eid=623064

http://sugoudemarketer.net/2009/04/htaccess.html

id:tontonpokopoko

rouge_2008さん、ありがとうございます。

まだ試してはないのですが、

この方法だと、.htaccess以下の階層(特定のページ以外にも)にきた、すべて携帯ユーザを特定のページに飛ばすことにはならないでしょうか・・?

2009/08/18 11:41:52
id:i4ooon No.2

回答回数56ベストアンサー獲得回数20

ポイント35pt

.htaccessは影響を回避するためにNGなら、PHPはどうなんでしょう?(サーバ次第ですね)

http://opqr.jp/2007/09/phppc.html

携帯は普通、JavaScriptは動きませんから、なんらかの動的な処理はやっぱりPHPが手軽でしょう。

要件が特定ファイルのみということでもあるようなので。

蛇足になりますが、UserAgentは容易に偽装できるので、もう少し精度をあげるならキャリアごとに公開されているアクセス元IPアドレス範囲も(PHPの場合)$_SERVER['REMOTE_ADDR']でチェックするのが1つの方法です。

それでも、IPアドレスさえも偽装できるとも聞いたことがあります(そんな方法は調べてもいませんし、知りませんが)し、UserAgentかつIPアドレスでチェックしないと、検索エンジンのクローラをはじいてしまう副作用が出る場合もありますので、注意してください。

id:tontonpokopoko

i4ooonさん、回答をありがとうございます。

今回はPHPは使わずに解決をいたしました。

しかし今後にPHPも使ってみたいと思います。参考になりました。

2009/08/20 02:59:55
  • id:pahoo
    確認をお願いします。
    JavaScriptを使うことで、「PC用のURL、リンクを変更」することにはならないと思うのですが、何がいけないのでしょうか。
  • id:tontonpokopoko
    いつもありがとうございます。
    説明下手で申し訳ありません。

    すでに特定のページには、何十か、もしくは100以上の、
    外部サイトからのリンクが張ってあるとします。

    やりたいことは外部サイトも含めたリンク元から、
    特定ページにアクセスしてくるユーザの振り分けです。
    (最初にアクセスされるのは特定ページです)

    特定ページを携帯用に書き換えるのは、したくないという意味でした。
  • id:pahoo
    > 特定ページを携帯用に書き換えるのは、したくないという意味でした。

    コメントありがとうございます。
    であれば、rouge_2008 さんが回答しているように、RewriteRuleを使うのが無難でしょう。
  • id:rouge_2008
    tontonpokopokoさん

    > この方法だと、.htaccess以下の階層(特定のページ以外にも)にきた、すべて携帯ユーザを特定のページに飛ばすことにはならないでしょうか・・?

    いいえ、大丈夫です。
    例の場合だと、「http://user.example.com/pc.html」にアクセスした携帯ユーザーのみ指定したページに飛ばします。

    RewriteRule ^pc\.html http://user.example.com/mobile.html [R]

    上記は、「RewiteRule 特定のページ(書き換え前のパス) 飛ばすページ(書き換え後のURLまたはパス) [R]」という形式になっています。
    ※「^pc\.html」は、特定のページが「.htaccess」と同じ階層にある場合です。(同じ階層にある場合は、ファイル名のみ指定すれば大丈夫です。)
    ※正規表現になっているので、「\.」のように拡張子の「.」の前に「\」をつけてください。

    特定のページは、「http://user.example.com/index.html」ですか?
    この場合は、以下のように指定してください。

    RewriteRule ^index\.html http://user.example.com/mobile.html [R]

    ※書き換え後のURLは、tontonpokopokoさんの環境に合わせて変更してください。
  • id:rouge_2008
    書き忘れました・・・

    特定のページが「index.html」で、「http://user.example.com/」でリンクされている場合もあるのでしたら、以下のようにRewriteRuleを2つ記述してください。(※RewriteCondもそれぞれ必要です。)

    RewriteEngine On
    RewriteBase /

    RewriteCond %{HTTP_USER_AGENT} ^(DoCoMo|KDDI|DDIPOKET|UP\.Browser|J-PHONE|Vodafone|SoftBank)
    RewriteRule ^$ http://user.example.com/mobile.html [R]

    RewriteCond %{HTTP_USER_AGENT} ^(DoCoMo|KDDI|DDIPOKET|UP\.Browser|J-PHONE|Vodafone|SoftBank)
    RewriteRule ^index\.html http://user.example.com/mobile.html [R]

    ※上のコメントにも書きましたが、他のページにアクセスした場合は飛ばしません。(どの階層のページでも大丈夫です。)
    例の場合は、「http://user.example.com/」または「http://user.example.com/index.html」にアクセスした携帯ユーザーだけ飛ばします。
  • id:tontonpokopoko
    pahooさん、rouge_2008さん、ありがとうございます。
    今は時間が取れないので、
    今夜にrouge_2008さんの方法を試してみたいと思います。

    後ほどもう1度、報告をさせていただきます。
    とりあえず、お礼まで。
  • id:rouge_2008
    i4ooonさんの回答にあるIPアドレスによる制限を追加したい場合、次のWEBアプリが役に立つと思います。

    「Mobile IP htaccess Maker」(携帯端末以外のIPを制限するhtaccessを簡単生成)
    http://www.dspt.net/tools/mobile_ip/
    ※携帯用のページが特定のディレクトリにまとめて入っているのでしたら、上記で生成されるものをそのまま「.htaccess」として携帯用のディレクトリに置くだけです。

    もしもPC用のファイルと携帯用のファイルが同じ場所にあるのでしたら、以下のページを参考にしてください。
    http://ken.ranvis.com/notes/web_hta_access
    http://php-web.net/web/htaccess.html

    <FilesMatch "正規表現によるファイル名">
    ここにWEBアプリで自動生成した.htaccessの中身を貼り付ける
    </FilesMatch>

    とりあえず、振り分け後に表示する携帯用の最初のページだけ指定すれば何とかなると思います。
  • id:tontonpokopoko
    rouge_2008さん、ありがとうございます。

    上記の方法で試したところ、
    .htaccess以下の階層で、403のエラーがでてしまいます。
    パーミッションは604ですよね?

    もう少し試してみます。
  • id:rouge_2008
    パーミッションは特に指定する必要はありませんが、600が可能なら600の方が良いです。
    IPアドレスによるアクセス制限も掛けたのでしょうか?
    <FilesMatch "正規表現によるファイル名">~</FilesMatch>の間に記述しましたか?
    この記述がないと、「.htaccess」のある階層以下すべてのファイルが対象となります。
    以下の形式にして試してください。

    <FilesMatch "正規表現によるファイル名">
    ここにWEBアプリで自動生成した.htaccessの中身を貼り付ける
    </FilesMatch>

    あと、アクセス確認はPCから行ったのでしょうか?
    携帯から行ったのでしょうか?
    プロバイダから付与されるIPアドレスが固定ではない場合、.htaccessに自分のIPアドレスを指定しても、IPが変動すると403エラーでアクセスできなくなります。
    PCから確認している場合はその点に注意してください。
    それから、良ければどのサーバーを使用しているのかも教えていただけますか?
  • id:tontonpokopoko
    rouge_2008さん、何度も丁寧にありがとうございます。
    IPアドレスの制限は行っておりません。
    私の環境(マイティサーバ)だと
    1行目に、Options +FollowSymLinks が必要みたいで、以下で正常に動作いたしました。
    (これがないと403エラーとなります)

    --------------------------
    Options +FollowSymLinks
    RewriteEngine On
    RewriteCond %{HTTP_USER_AGENT} ^(DoCoMo|KDDI|DDIPOKET|UP\.Browser|J-PHONE|Vodafone|SoftBank)
    RewriteRule ^pc\.html http://user.example.com/mobile.html [R]
    --------------------------

    勘違いをしていたのですが、
    この書き方だとhtaccess以下の階層がすべてモバイルページにジャンプすると思っていました。

    今回いろいろ教えてもらったことは大変参考になりました。
    経過と詳細を伝えられず、お手数をおかけして申し訳ありませんでした。

    また以前から悩んでいることがあるのですが、
    htaccessを併用する書き方が分かりません。

    例えば、私の階層の1番上に、
    phpをインクルードするhtaccessを設置してます。

    --------------------------
    Options ExecCGI Includes
    AddHandler cgi-script .cgi
    AddType application/x-httpd-php .php .html
    --------------------------

    これと今回の振り分けを併用する場合が分からないのです。

    --------------------------
    Options ExecCGI Includes
    AddHandler cgi-script .cgi
    AddType application/x-httpd-php .php .html

    Options +FollowSymLinks
    RewriteEngine On
    RewriteCond %{HTTP_USER_AGENT} ^(DoCoMo|KDDI|DDIPOKET|UP\.Browser|J-PHONE|Vodafone|SoftBank)
    RewriteRule ^pc\.html http://user.example.com/mobile.html [R]
    --------------------------

    と、これではうまくいきませんよね?

    ご助言をいただければ幸いです。
    よろしくお願いします。
  • id:rouge_2008
    > 例えば、私の階層の1番上に、
    > phpをインクルードするhtaccessを設置してます。

    --------------------------
    Options ExecCGI Includes
    AddHandler cgi-script .cgi
    AddType application/x-httpd-php .php .html
    --------------------------
    >これと今回の振り分けを併用する場合が分からないのです。

    phpをインクルードするための.htaccessというのが良く分かりませんが、拡張子「.html」でphpが動作するようにしているのでしょうか?
    サーバーによると思いますが、「Options ExecCGI Includes」を削除しても動作しないでしょうか?
    特にCGIは、オリジナルCGIの設置を許可している所でしたら、特に設定の必要なく動作するはずですので、「ExecCGI」と「AddHandler cgi-script .cgi」は書かなくても大丈夫ではないかと思います。
    もし必要な場合は、「Options ExecCGI Includes」ではなくて、「Options +ExecCGI +Includes」とすると元々のサーバー側の設定に追加する形になりますので、設定が上書きされることはありません。
    「Options +FollowSymLinks」が必要だったのも、もしかしたら上記の設定によりサーバー側の設定が上書きされて無効になったためかもしれません。

    http://mikeneko.creator.club.ne.jp/~lab/web/htaccess/directory.html

    サーバー側で既にCGIの実行が許可されている場合は、以下のようにしてみてください。

    Options +Includes +FollowSymLinks
    AddType application/x-httpd-php .php .html

    RewriteEngine On
    RewriteBase /
    RewriteCond %{HTTP_USER_AGENT} ^(DoCoMo|KDDI|DDIPOKET|UP\.Browser|J-PHONE|Vodafone|SoftBank)
    RewriteRule ^pc\.html http://user.example.com/mobile.html [R]


    ※サーバー側ですべて許可されている場合は、Optionsの設定をすべて削除して、以下のように書いても動作する可能性があります。

    AddType application/x-httpd-php .php .html

    RewriteEngine On
    RewriteBase /
    RewriteCond %{HTTP_USER_AGENT} ^(DoCoMo|KDDI|DDIPOKET|UP\.Browser|J-PHONE|Vodafone|SoftBank)
    RewriteRule ^pc\.html http://user.example.com/mobile.html [R]


    ※上記2つに共通することですが、PC用のファイルがルート直下ではなくフォルダ内にあるのでしたら、「RewriteRule」のファイルのパスを変更する必要があります。
  • id:rouge_2008
    Optionsの設定方法は、Apacheのドキュメントも分かりやすいと思います。
    http://httpd.apache.org/docs/2.0/ja/mod/core.html#options
  • id:tontonpokopoko
    rouge_2008さん、ありがとうございます。

    >phpをインクルードするための.htaccessというのが良く分かりませんが、拡張子「.html」でphpが動作するようにしているのでしょうか?

    その通りです。
    ページの1部を一括で操作できるように、
    ほとんどのhtml内に、PHPのスペースを挿入しています。


    今回、Options +FollowSymLinksが必要だったのは、
    お察しの通り、上位のhtaccessが関係しているような気がしています。

    Options ExecCGI Includes
    AddHandler cgi-script .cgi

    の2行を取っていろいろと試したいと思います。
    (影響の少ない夜中に予定です)

    ただそうすると下位のhtaccessの設定を、
    またすべて変更しなければならないかもしれませんね。
    (すでに10以上のhtaccessを設置していますので・・)

    URLも記載していただき、本当にありがとうございました。
    今後htaccessで困ったときに、このメモを参考にさせていただきます。


この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません