どうも苦手だけど、避けて通れない.htaccessファイル・・・
その場しのぎじゃなくてちゃんと意味を理解してかかなきゃなぁ。
ということで少しづつ勉強していってます。
その覚書なので、ぼちぼち追記してゆきます。
ドメイン内で階層がある場合
https://mutimut.com/test/
のように、ドメイン直下にサブディレクトリを作っている状態。
- pcからのアクセス時は、そのまま/test/ディレクトリを表示。
- スマホの時は/test/の中のsp/ディレクトリにリダイレクトしたい。
.htaccessファイルは test ディレクトリに置いています。
ちゃんとリダイレクトできてる版
つまりリライトの基本は.htaccessファイルが置かれた場所(test/)がルート。
<ifModule mod_expires.c> RewriteEngine on # RewriteBase / RewriteCond %{REQUEST_URI} !/sp/ RewriteCond %{HTTP_USER_AGENT} (iPod|iPhone|Android.*Mobile|Windows.*Phone) [NC] RewriteRule ^(.*)$ sp/$1 [R,L] RewriteCond %{REQUEST_URI} /sp/ RewriteCond %{HTTP_USER_AGENT} !(iPod|iPhone|Android.*Mobile|Windows.*Phone) RewriteRule ^sp/(.*)$ $1 [R,L] </IfModule>
上記のように書くと、ちゃんとリダイレクトできます。
ディレクトリを無視してルートへ飛んでしまう版
上記と同じ条件で、ちょっと書き方を間違えるとうまくいかない、というパターンです。
同じくRewriteBase /はコメントアウトしています。
<ifModule mod_expires.c> RewriteEngine on # RewriteBase / RewriteCond %{REQUEST_URI} !/sp/ RewriteCond %{HTTP_USER_AGENT} (iPod|iPhone|Android.*Mobile|Windows.*Phone) [NC] RewriteRule ^(.*)$ /sp/$1 [R,L] RewriteCond %{REQUEST_URI} /sp/ RewriteCond %{HTTP_USER_AGENT} !(iPod|iPhone|Android.*Mobile|Windows.*Phone) RewriteRule ^sp/(.*)$ /$1 [R,L] </IfModule>
赤字の部分、先頭にスラッシュ入れると /test/のディレクトリを無視してドメインのルート(https://mutimut.com/)に行ってしまいます。
なぜかというと、冒頭に/を入れたことによってパスの指定が相対パスではなくなったため、
RewriteBase / の指定なし → .htaccessファイルの設置場所がルート
というルールが崩れるためです。
こちらの記事がとても参考になりました。
mod_rewriteの使い方・.htaccessでリダイレクトする
置換対象には、リダイレクト先などを書く。置換対象に相対パス(スラッシュなし)を書くと、
RewriteBase
がパスとなる。
例えば、RewriteBase
が [hoge
] で、置換対象に [app/index.html
] (相対パス)と書くと、生成される URL は [/hoge/app/index.html
] となる。
[/app/index.html
]とするとそのまま、何も付加されない。
スマホディレクトリにurlを変えずに転送
RewriteCond %{REQUEST_URI} !/sp/
RewriteCond %{HTTP_USER_AGENT} (iPod|iPhone|Android.*Mobile|Windows.*Phone) [NC]
# RewriteCond %{QUERY_STRING} !mode=pc [NC]
RewriteRule ^(.*)$ sp/$1 [R,L]
spディレクトリじゃないディレクトリにスマホからアクセスがあれば、spディレクトリに転送したい。その場合は上記の記述でOK。
でもURLにspは表示させたくない・・・そんな場合、記述末尾のRを
RewriteRule ^(.*)$ sp/$1 [L]
消すだけでOK!すごい!
Lは転送処理を終える合図なのでそのまま残します。