質問: .htaccessを使ったデバイスごとのURLの振り分け お世話になります。 自分でやってみてもうまくいかないので、ご回答いただければ幸いです。 htaccessの書き方を教えて下さい。 ### 前提・実現したいこと ・サーバーはxserverです ・HTMLサイト (1) SPディレクトリが、PCディレクトリのサブディレクトリになっている。 (例) PCサイト : http://example.com/ SPサイト : http://example.com/sp/ (2) 同一ページは同一のファイル名になっている。 (例) PCサイト : http://example.com/page01.html SPサイト : http://example.com/sp/page01.html やりたいことは ⇒ https://www.seohacks.net/basic/qa/sites_tuning_sp/ 上記ページの「3.UAに応じた302リダイレクトの設定」 そして ・PCからスマホサイトにアクセスした時は、PC版のサイトが表示され、「/sp/」なしのURLがブラウザバーに表示される ・スマホからPCサイトにアクセスした時は、スマホ版のサイトが表示され、**「/sp/」なし**のURLがブラウザバーに表示される ようにしたいです。 ### 試したこと こちらのページの ⇒ https://qiita.com/yokoh9/items/2e23198294ba314b4b4b 「デバイスごとに振分けを行い、指定ディレクトリにリダイレクトさせる」を参考に302リダイレクトをかけてみました。 PCから「/sp/」ありのURLにアクセスした場合は意図通りになったのですが スマホから「http://example.com/」にアクセスすると、ブラウザバー上の表示が「http://example.com/sp/」になってしまいます。 /sp/ありのURLが表示されるとGoogle Analytics上でも/sp/が出てしまい、アクセス解析がしにくくなるので、 スマホで見た時に「スマホ版は表示されるがURLは/sp/無しのurl」にしたいのですが、どう記述すれば良いでしょうか。 ### .htaccessの現状の記載 以下が現状の記載内容です。一応、どこまで書いたら良いのか分からなかったので、今回の質問とは関係のない部分も全て一緒に記載しています。 --- ``` #suPHP_ConfigPath/home/example/example.com/xserver_php/ RewriteEngine on RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{HTTP_HOST} ^example\.com RewriteRule (.*) https://www.example.com/$1 [R=301,L] RewriteCond %{THE_REQUEST} ^.*/index.html RewriteRule (.*)index.html$ https://www.example.com/$1 [R=301,L] RewriteCond %{REQUEST_URI} !/sp/ RewriteCond %{HTTP_USER_AGENT} (iPod|iPhone|iPad|Android|Windows\ Phone) RewriteRule ^(.*)$ sp/$1 [R=302,L] RewriteBase / RewriteCond %{REQUEST_URI} /sp/ RewriteCond %{HTTP_USER_AGENT} !(iPod|iPhone|iPad|Android|Windows\ Phone) RewriteRule ^sp/(.*)$ $1 [R=302,L] RewriteBase / Header set Vary User-Agent ```
回答: 「/sp/」なしとするのであれば、リダイレクト([R=302])は不要です。 ``` RewriteCond %{REQUEST_URI} !/sp/ RewriteCond %{HTTP_USER_AGENT} (iPod|iPhone|iPad|Android|Windows\ Phone) RewriteRule ^(.*)$ sp/$1 [L] ``` 逆に、スマホから「/sp/」ありのときに、なしにする設定が必要なのでは? ### (2019/03/05 23:38) 追記 PC で「/sp/」→「/」にリダイレクトできているのですから、スマホでも同じようにできるはずです。 もっというと、PC でもスマホでも「/sp/」→「/」にリダイレクトするので、`RewriteCond` の条件は不要になります。 ただし、スマホの場合、前述の「/」→「/sp/」(内部リダイレクト)とリダイレクトループになるので、「/」→「/sp/」は `[END]` で終了します。 [END] は httpd-2.4 以降で使用できます。 ``` RewriteCond %{REQUEST_URI} !^/sp/ RewriteCond %{HTTP_USER_AGENT} (iPod|iPhone|iPad|Android|Windows\ Phone) RewriteRule ^(.*)$ sp/$1 [END] RewriteRule ^sp/(.*)$ $1 [R=302,L] ```