携帯振り分けと、パーマリンク書き換えのhtaccess
-
はじめまして。
wordpressではない携帯サイトと、wordpressで作ったPCサイトを同じアドレスで作っています。
.htaccessで携帯からのアクセスは携帯サイトへいくように振り分けています。
しかし、wordpressでパーマリンクを変えた時に.htaccessが更新されると、携帯サイトへの振り分けがうまくいかないようで、携帯でアクセスしようとすると、エラーが出てしまいます。どうにかして携帯サイトへの振り分けと、パーマリンクの変更(%postname%)を両立させたいのですが、どうしてもわかりません。
以下は携帯でエラーが出るときの.htaccessです。
どうかよろしくお願いします。AddHandler x-httpd-php524 .php
Options +FollowSymLinks
RewriteEngine OnsuPHP_ConfigPath /usr/home/サーバー/html/*****/
AddHandler server-parsed html
AddType application/xhtml+xml .htmlRewriteEngine 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>
-
携帯サイトは 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>まずは本題から外れた話題。
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でしょうね普通は。みなさん、ていねいな返信をいただき、ありがとうございます。
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(モバイル用のインデックスファイル)でしょうか?
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行目までを見せて下さい。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
の書き方の問題なのでしょうが、簡単な解決方法として。未検証ですが;)shokun0803さん、返信ありがとうございます。
rockhopper2000さんに教えていただいた、.htaccessに、shokun0803さんの教えていただいた方法をプラスすることで、携帯からもアクセスできるようになりました。
ただ、
http://example.co.jp/*****
というアドレスでは、携帯からのアクセスで404エラーになってしまいます。
http://example.co.jp/*****/
と、最後にスラッシュを付けるとうまく表示されるのですが…。すでにスラッシュを付けないアドレスで、QRコードをチラシ等に印刷し配布しているため、できればスラッシュなしで表示したいのですが、いかがでしょう。
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>
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>
- トピック「携帯振り分けと、パーマリンク書き換えのhtaccess」には新たに返信することはできません。