ユーザーエージェントを見て、スマホの場合は

スマホ用のページへリダイレクトするようにしたいと思います。
ただここで問題なのは、すべてのページでスマホ用ページがあるわけではなく
主要ページはスマホ用ページがあり、それ以外はスマホ用ページがないため、
無い場合は、PC用ページをそのまま表示したいということです。
【例】
スマホ用ページがある場合
sample.jp/a/index.html⇒sample.jp/a/sm-index.html

スマホ用ページが無い場合
sample.jp/a/sub.html⇒そのままリダイレクトしない

現在は、除外リストを作って、それに当てはまる場合はリダレクトしないように
しているのですが、ファイル数が多いことと、今後のメンテナンスを考えると
トラブルが起きそうなので、スマホ用のページのファイルがない場合は
リダイレクトしないというようにしたいのですが、書き方が分からず
困っています。

sample.jp/a/index.html
ここにアクセスがあった場合、
sample.jp/a/sm-index.html
このファイルがあれば、そこにリダイレクトし
無ければ、リダレクトしないようにしたいのです。

どなたかご教授いただければ幸いです。

回答の条件
  • 1人1回まで
  • 13歳以上
  • 登録:2014/10/22 21:36:12
  • 終了:2014/10/23 14:42:13

ベストアンサー

id:a-kuma3 No.3

a-kuma3回答回数4524ベストアンサー獲得回数18802014/10/23 10:51:43

ポイント1000pt

こんな感じで、いけると思います。

RewriteEngine On

RewriteCond %{HTTP_USER_AGENT} (iPhone|iPod|Android|BlackBerry|Windows\ Phone) [NC]
RewriteCond %{DOCUMENT_ROOT}$1/sm-$2 -f
RewriteRule ^(.*)/([^/]+)$ $1/sm-$2 [L]

一応、解説。

RewriteCond %{HTTP_USER_AGENT} (iPhone|iPod|Android|BlackBerry|Windows\ Phone) [NC]

エージェントを見て、スマホを区別。
ここは、今もあるでしょうから、そちらを使ってください。

RewriteRule ^(.*)/([^/]+)$ $1/sm-$2 [L]

先に RewriteRule の説明。
スマホ用ページの URL に書き換えてます。
ファイル名の頭に "sm-" をつけます。
こちらも持ってますよね。

RewriteCond %{DOCUMENT_ROOT}$1/sm-$2 -f

スマホ用ページのファイルが存在するかどうかのチェック。
勘所は RewriteRule の条件部分に書いた正規表現の後方参照 ($1 とか) が、RewriteCond でも使える、というところ。
ファイルの置き場所を指定しなきゃいけないので、%{DOCUMENT_ROOT} を頭につけます。


試すにあたって、参考にしたのは、以下の二つ。
http://koseki.hatenablog.com/entry/20090611/ModRewrite
http://httpd.apache.org/docs/2.4/ja/mod/mod_rewrite.html

RewriteCond での正規表現の後方参照 (%1 とか) を、次の RewriteCond や RewriteRule でも使えるっぽいので、別解がもうひとつありそうです :-)

id:kynism

ありがとうございます!

ビンゴです!

> RewriteRule の条件部分に書いた正規表現の後方参照 ($1 とか) が、RewriteCond でも使える、というところ。

これができることが分からなくて苦労していました。
本当に助かりました。
ありがとうございました!

2014/10/23 14:40:54

その他の回答(2件)

id:kazukichi_0914 No.1

かずきち。回答回数126ベストアンサー獲得回数82014/10/22 22:10:52

RewriteEngine On
RewriteCond %{HTTP_HOST} !^m.webase.jp [NC]
RewriteCond %{QUERY_STRING} !pc.*$
RewriteCond %{HTTP_USER_AGENT} (iPhone|iPod|Android|BlackBerry|Windows\ Phone) [NC]
RewriteCond %{HTTP_USER_AGENT} !iPad [NC]
RewriteRule ^(.*)$ http://m.webase.jp$1 [R=301,L]

このような.htaccessを置いて読みこめばいいですよ。
。hたっせっsの説明は下を。
http://htaccess.me/

id:kynism

早速、ご回答ありがとうございます。
この方法は、スマホサイトがサブドメイン(m)にある場合の方法だと思いますが
私のサイトでは、質問の例のように、ファイル名に「sm-」を付加する形式で
スマホページを展開しています。
また、今回の一番の問題は、スマホページが無い場合に、PCページをそのまま表示したいと
言う点です。
もし、お分かりになりましたら、またお願い致します。

2014/10/22 22:28:05
id:a-kuma3

この回答は、以下のページのコピペです。
http://www.webase.jp/news/2012/12/uatablet1212.html

過去の回答履歴を見れば、どのような回答をする利用者か分かります。

2014/10/22 23:09:52
id:pogpi No.2

POGPI回答回数377ベストアンサー獲得回数502014/10/23 07:12:31

「iPhone」とかを含む場合に、Javascriptで、

location.replace("リダイレクト先");

で、どうですか。

id:kynism

回答ありがとうございます。

javascriptの場合、アクセス解析でリファラーが取れなくなってしまうため
断念しました。

また何か良いアイディアがあれば、よろしくお願い致します。

2014/10/23 09:34:35
id:a-kuma3 No.3

a-kuma3回答回数4524ベストアンサー獲得回数18802014/10/23 10:51:43ここでベストアンサー

ポイント1000pt

こんな感じで、いけると思います。

RewriteEngine On

RewriteCond %{HTTP_USER_AGENT} (iPhone|iPod|Android|BlackBerry|Windows\ Phone) [NC]
RewriteCond %{DOCUMENT_ROOT}$1/sm-$2 -f
RewriteRule ^(.*)/([^/]+)$ $1/sm-$2 [L]

一応、解説。

RewriteCond %{HTTP_USER_AGENT} (iPhone|iPod|Android|BlackBerry|Windows\ Phone) [NC]

エージェントを見て、スマホを区別。
ここは、今もあるでしょうから、そちらを使ってください。

RewriteRule ^(.*)/([^/]+)$ $1/sm-$2 [L]

先に RewriteRule の説明。
スマホ用ページの URL に書き換えてます。
ファイル名の頭に "sm-" をつけます。
こちらも持ってますよね。

RewriteCond %{DOCUMENT_ROOT}$1/sm-$2 -f

スマホ用ページのファイルが存在するかどうかのチェック。
勘所は RewriteRule の条件部分に書いた正規表現の後方参照 ($1 とか) が、RewriteCond でも使える、というところ。
ファイルの置き場所を指定しなきゃいけないので、%{DOCUMENT_ROOT} を頭につけます。


試すにあたって、参考にしたのは、以下の二つ。
http://koseki.hatenablog.com/entry/20090611/ModRewrite
http://httpd.apache.org/docs/2.4/ja/mod/mod_rewrite.html

RewriteCond での正規表現の後方参照 (%1 とか) を、次の RewriteCond や RewriteRule でも使えるっぽいので、別解がもうひとつありそうです :-)

id:kynism

ありがとうございます!

ビンゴです!

> RewriteRule の条件部分に書いた正規表現の後方参照 ($1 とか) が、RewriteCond でも使える、というところ。

これができることが分からなくて苦労していました。
本当に助かりました。
ありがとうございました!

2014/10/23 14:40:54

コメントはまだありません

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません