サポート » 使い方全般 » 携帯振り分けと、パーマリンク書き換えのhtaccess

  • 解決済 kikaku

    (@kikaku)


    はじめまして。

    wordpressではない携帯サイトと、wordpressで作ったPCサイトを同じアドレスで作っています。
    .htaccessで携帯からのアクセスは携帯サイトへいくように振り分けています。
    しかし、wordpressでパーマリンクを変えた時に.htaccessが更新されると、携帯サイトへの振り分けがうまくいかないようで、携帯でアクセスしようとすると、エラーが出てしまいます。

    どうにかして携帯サイトへの振り分けと、パーマリンクの変更(%postname%)を両立させたいのですが、どうしてもわかりません。

    以下は携帯でエラーが出るときの.htaccessです。
    どうかよろしくお願いします。

    AddHandler x-httpd-php524 .php
    Options +FollowSymLinks
    RewriteEngine On

    suPHP_ConfigPath /usr/home/サーバー/html/*****/
    AddHandler server-parsed html
    AddType application/xhtml+xml .html

    RewriteEngine On
    RewriteCond %{HTTP_USER_AGENT} ^(DoCoMo|KDDI|DDIPOKET|UP.Browser|J-PHONE|Vodafone|SoftBank|Googlebot-Mobile|Y!J-SRD/1.0|Y!J-MBS/1.0)
    RewriteRule ^$ /*****/mob/ [R]

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /*****/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /*****/index.php [L]
    </IfModule>

15件の返信を表示中 - 1 - 15件目 (全18件中)
  • 携帯サイトは Ktai Style プラグインを使って作るのが簡単&確実です。

    上記の記述を見て不思議なところがいくつかあるんですけど、その前に
    エラーとはどんなエラーですか?

    Firefoxに「User Agent Switcher」と「Live HTTP header」プラグインを入れて、
    レスポンスヘッダを教えて下さい。

    あとディレクトリ構成は以下でしょうか?

    usr/home/サーバー/html/*****/

    *****が公開ディレクトリ(ルート)ですよね。
    モバイルサイト
    /mob/
    PCサイト
    /

    Apache(mod_dir)のDirectoryIndexはどうなってますか?

    以下のようにしたらどうなりますか?

    RewriteEngine On
    RewriteBase /
    RewriteCond %{HTTP_USER_AGENT} ^(DoCoMo|KDDI|DDIPOKET|UP.Browser|J-PHONE|Vodafone|SoftBank|Googlebot-Mobile|Y!J-SRD/1.0|Y!J-MBS/1.0)
    RewriteRule ^(.*)$ /mob/$1 [R=301,L]

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>

    モデレーター IKEDA Yuriko

    (@lilyfan)

    まずは本題から外れた話題。

    RewriteCond %{HTTP_USER_AGENT} ^(DoCoMo|KDDI|DDIPOKET|UP.Browser|J-PHONE|Vodafone|SoftBank|Googlebot-Mobile|Y!J-SRD/1.0|Y!J-MBS/1.0)

    どのような情報を参考にされたのか知りませんが、これはちょっと古い、かつ間違っています。

    * DDIPOKET ではなく DDIPOCKET が正当です。
    * DDIPOCKET を入れるなら WILLCOM も入れましょう。ウィルコムになってから発売された端末はすべて WILLCOM です。
    * J-PHONE は今月末までのサービスです。4月1日以降は不要です。
    * Vodafone も、現在使える機種は1機種しか残っていないので削除しても問題ありません。
    * せっかくなので、 emobile, Huawei, IAC も入れてみてください (イー・モバイルの音声端末です)。
    * Googlebot Mobile とかは、基本的に携帯端末のユーザーエージェントを名乗っているので、「検索エンジンだけを特別に識別したい」のでない限り、検出するのは無駄です。

    本題ですが、おそらく /mob/ にリダイレクトした後も、最終段の Rewrite Rule にマッチしてしまっているのでしょう。明示的に /mob/ を除外してみてください。

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /*****/
    RewriteCond %{REQUEST_URI} !/mob/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /*****/index.php [L]
    </IfModule>

    おそらく /mob/ にリダイレクトした後も、

    そういえば、/mob/には.htaccessはあるのでしょうか?
    また気になるのですが、
    /mob/のindexファイルは.html or .php ?
    AddType application/xhtml+xml .htmlとあるからhtmlでしょうね普通は。

    トピック投稿者 kikaku

    (@kikaku)

    みなさん、ていねいな返信をいただき、ありがとうございます。

    kzさん、ktaistyleは他サイトではいくつか利用しています。
    今回は携帯サイトがすでに出来上がってしまっていて、公開間近なためktaistyleへの移行は難しい気がして悪戦苦闘しています。

    rockhopper2000さん、
    携帯のエラーというのは、キャリアによっていろいろですが、ドコモでは「無効なデータを受信しました(302)」となります。
    ・Firefoxに「User Agent Switcher」と「Live HTTP header」プラグイン
    ・Apache(mod_dir)のDirectoryIndex
    の意味がよくわからなくて、「以下のようにしたら…」の部分だけ試させてもらいました。
    結果は携帯では「Not Found」、wordpressでもページへ移動しようとすると404となりました。
    携帯のほうのアドレスが、本当はhttp://********.co.jp/*****/mob/なのに、http://********.co.jp/mob/になっていました。
    /mob/には.htaccessはありません。
    /mob/のindexファイルは.htmlです。

    lilyfanさん、
    ユーザーエージェントの部分は、どこかのサイトからのコピペだったと思います。
    教えていただいたように試したところ、携帯では「無効なデータを受信しました(302)」という同じエラーのまま、wordpressでは正常にページへ移動することができています。

    ・Firefoxに「User Agent Switcher」と「Live HTTP header」プラグイン

    Firefoxに「User Agent Switcher」と「Live HTTP header」プラグインをインストールして下さい。
    Firefoxを立ち上げ、
    ツールメニュー→アドオン→アドオンを入手 で上記2つのアドオンをインストールします。
    ・「User Agent Switcher」はPCからのアクセスを携帯のユーザーエージェントに偽装します。(携帯でのアクセスと見なして動作確認ができます)
    ・「Live HTTP header」はそのアクセス時のサーバからの応答をリアルタイムで見ることができます。
    (それぞれの使用方法はググって見て下さい、沢山あります)

    ・Apache(mod_dir)のDirectoryIndex

    WEBページの表示ファイル・ディレクトリのコントロールに利用されるサーバアプリケーションApacheには、
    /(スラッシュ)で終わるURIがリクエストされた場合に、表示させる順番をコントロールする機能があります。
    http://httpd.apache.org/docs/2.0/ja/mod/mod_dir.html
    このファイルの書き込み順番で、表示されるファイルが違います。
    例:
    DirectoryIndex hogehoge.html home.html index.html index.htm index.shtml index.php
    この例ではまず最初にhogehoge.htmlが表示、hogehoge.htmlがないディレクトリではhome.htmlとなります。
    通常のレンサバではサーバ自体に適切に設定されていることが多いですが、なかにはいい加減なところもあります。
    .htaccessに記入し自分でコントロールすることもできます。
    同じディレクトリにindex.html index.phpを設置して運用する場合には、明示的に読み込み順をコントロールする必要があります。

    「無効なデータを受信しました(302)」

    Redirectが302となってるみたいですね。

    携帯のほうのアドレスが、本当はhttp://********.co.jp/*****/mob/なのに、http://********.co.jp/mob/になっていました。


    .co.jp/*****/mob/
    部分の*****が不思議なのですが?

    ディレクトリ構成を正確に記入いただけますか?
    http://example.co.jp/(ルート)
    以下ルート下位として記入
    /index.php(WordPressのインデックスファイル)
    /.htaccess(WordPressの.htaccess)
    /wp/(WordPressのコアファイル群設置ディレクトリ)
    /mob/(モバイル用のファイル設置ディレクトリ)
    /mob/index.html(モバイル用のインデックスファイル)

    でしょうか?

    トピック投稿者 kikaku

    (@kikaku)

    rockhopper2000さん、何度もありがとうございます。
    ドコモのユーザーエージェントで、「Live HTTP header」を見たら、以下が出ていました。
    まったく見方がわかりませんが、レスポンスヘッダというのはこれのことでしょうか。

    HTTP/1.1 404 Not Found
    Date: Fri, 12 Mar 2010 04:21:41 GMT
    Server: Apache
    Cache-Control: no-cache, must-revalidate, max-age=0
    Expires: Wed, 11 Jan 1984 05:00:00 GMT
    Pragma: no-cache
    X-Pingback: http://example.co.jp/*****/xmlrpc.php
    X-Powered-By: PHP/5.2.4
    Last-Modified: Fri, 12 Mar 2010 04:21:42 GMT
    Keep-Alive: timeout=15, max=99
    Connection: Keep-Alive
    Transfer-Encoding: chunked
    Content-Type: text/html; charset=UTF-8

    またディレクトリ構成は、

    http://example.co.jp/(ルート)
    以下ルート下位として記入
    /*****/index.php(WordPressのインデックスファイル)
    /*****/.htaccess(WordPressの.htaccess)
    /*****/wp/(WordPressのコアファイル群設置ディレクトリ)
    /*****/mob/(モバイル用のファイル設置ディレクトリ)
    /*****/mob/index.html(モバイル用のインデックスファイル)

    このようにしています。

    もともと、http://example.co.jp/という本サイトがあり、その支店のサイト、として今のサイトを作っています。
    http://example.co.jp/*****/の中にwordpressとmobという携帯用のフォルダが入っています。
    この状態に問題があったのでしょうか…。

    RewriteEngine On
    RewriteBase /*****/
    RewriteCond %{HTTP_USER_AGENT} ^(DoCoMo|KDDI|DDIPOKET|UP.Browser|J-PHONE|Vodafone|SoftBank|Googlebot-Mobile|Y!J-SRD/1.0|Y!J-MBS/1.0)
    RewriteRule ^(.*)$ /*****/mob/$1 [R=301,L]

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /*****/
    RewriteCond %{REQUEST_URI} !/mob/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /*****/index.php [L]
    </IfModule>

    としたらどうなりますか?

    (念のため確認ですが/*****/.htaccessに記入してますか?)

    まただめなら、
    Live HTTP headerで
    http://example.co.jp/*****/
    http://example.co.jp/*****/index.html
    とした場合はどうなりますか?
    1行目から最初の点線の下1行目までを見せて下さい。

    トピック投稿者 kikaku

    (@kikaku)

    rockhopper2000さん、お世話になっております。

    教えていただいた通り、/*****/.htaccessに記入した場合、wordpressでのパーマリンク変更はOK、携帯からのアクセスは同じくエラーでした。
    その時のLive HTTP headerは以下です。

    http://example.co.jp/*****/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/
    
    GET /*****/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/ HTTP/1.1
    Host: example.co.jp
    User-Agent: DoCoMo/2.0 N901iS(c100;TB;W24H12)
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: ja
    Accept-Encoding: gzip,deflate
    Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 115
    Connection: keep-alive
    
    HTTP/1.1 301 Moved Permanently
    Date: Mon, 15 Mar 2010 00:56:54 GMT
    Server: Apache
    Location: http://example.co.jp/*****/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/mob/
    Keep-Alive: timeout=15, max=99
    Connection: Keep-Alive
    Transfer-Encoding: chunked
    Content-Type: text/html; charset=iso-8859-1
    ----------------------------------------------------------

    またhttp://example.co.jp/*****/とした場合は以下のようになりました。

    http://example.co.jp/*****/
    
    GET /*****/ HTTP/1.1
    Host: example.co.jp
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: ja
    Accept-Encoding: gzip,deflate
    Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 115
    Connection: keep-alive
    
    HTTP/1.1 200 OK
    Date: Mon, 15 Mar 2010 01:01:46 GMT
    Server: Apache
    X-Pingback: http://example.co.jp/*****/xmlrpc.php
    X-Powered-By: PHP/5.2.4
    Keep-Alive: timeout=15, max=100
    Connection: Keep-Alive
    Transfer-Encoding: chunked
    Content-Type: text/html; charset=UTF-8
    ----------------------------------------------------------

    ほんとにもう、何が何だか分からないのですが、よろしくお願いします…。

    ループを起こしているので/mob/に新たにhtaccessを作成しRewriteEngine Offしたらいいように思います。
    まあ、RewriteRuleの書き方の問題なのでしょうが、簡単な解決方法として。未検証ですが;)

    トピック投稿者 kikaku

    (@kikaku)

    shokun0803さん、返信ありがとうございます。

    rockhopper2000さんに教えていただいた、.htaccessに、shokun0803さんの教えていただいた方法をプラスすることで、携帯からもアクセスできるようになりました。

    ただ、
    http://example.co.jp/*****
    というアドレスでは、携帯からのアクセスで404エラーになってしまいます。
    http://example.co.jp/*****/
    と、最後にスラッシュを付けるとうまく表示されるのですが…。

    すでにスラッシュを付けないアドレスで、QRコードをチラシ等に印刷し配布しているため、できればスラッシュなしで表示したいのですが、いかがでしょう。

    モデレーター IKEDA Yuriko

    (@lilyfan)

    http://example.co.jp/*****
    というアドレスでは、携帯からのアクセスで404エラーになってしまいます。
    http://example.co.jp/*****/
    と、最後にスラッシュを付けるとうまく表示されるのですが…。

    明示的にリダイレクトが必要でしょうね。

    RedirectMatch ^/*****$ http://example.co.jp/*****/

    あと、ループ防止は /mob/ で処理するよりは上位側で除外する手もあります。
    (携帯振り分けも修正。本当はご自身で直してほしいところですが、まあついでなので)

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /*****/
    RewriteCond %{REQUEST_URI} !/mob/
    RewriteCond %{HTTP_USER_AGENT} ^(DoCoMo|KDDI|DDIPOCKET|WILLCOM|UP.Browser|J-PHONE|Vodafone|SoftBank|emobile|Huawei|IAC)
    RewriteRule ^(.*)$ /*****/mob/$1 [R=301,L]
    RewriteCond %{REQUEST_URI} !/mob/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /*****/index.php [L]
    </IfModule>
    トピック投稿者 kikaku

    (@kikaku)

    lilyfanさん、携帯振り分けの修正、ありがとうございます。
    とっても助かりました。
    リダイレクト、やってみたのですがまたエラーになってしまって…。
    先の方法に戻しました。

    そして、rockhopper2000さんに教えていただいた.htaccessの中で、

    RewriteRule ^(.*)$ /*****/mob/$1 [R=301,L]

    の部分の$1を消したら、スラッシュなしのアドレスでも携帯からアクセスできるようになりました。
    これでやりたいことはすべて実現したのですが、これは良くない方法でしょうか。

    >$1を消したら
    う〜ん、何ででしょうね?
    /***** が^(.*)$で評価されるわけですかね。

    以下にしたらどうなのでしょう。

    /mob/に新たに.htaccessを作成しRewriteEngine Off

    の前提で。

    DirectoryIndex index.html index.php

    RedirectMatch permanent ^/*****$ http://example.co.jp/*****/

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /*****/
    RewriteCond %{HTTP_USER_AGENT} ^(DoCoMo|KDDI|DDIPOCKET|WILLCOM|UP.Browser|J-PHONE|Vodafone|SoftBank|emobile|Huawei|IAC)
    RewriteRule ^(.*)$ /*****/mob/$1 [R=301,L]
    RewriteCond %{REQUEST_URI} !/*****/mob/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /*****/index.php [L]
    </IfModule>

    トピック投稿者 kikaku

    (@kikaku)

    rockhopper2000さん、最後までおせわになります。

    ↑ご提案していただいたようにすると、
    ドコモではNotFoundとなり、
    The request URL /*****/mob//usr/home/サーバー/html/***** was not found on this server.
    と表示されます…。

    問題がなければ、$1をはずしたままでいこうと思います。

15件の返信を表示中 - 1 - 15件目 (全18件中)
  • トピック「携帯振り分けと、パーマリンク書き換えのhtaccess」には新たに返信することはできません。