質問: さくらインターネットサーバーを利用しており、 下記のようなディレクトリで3つのサイトを管理しています。 home 初期ドメイン ーwww ーードメイン1 ーーーpublic_htmlーindex.html ーードメイン2 ーードメイン3 --- このうちのドメイン1に対してリダイレクトをしたいので [https://help.sakura.ad.jp/206054622/]や [https://www.garunimo.com/program/p35.php]を参考に wwwフォルダに以下のようなhtaccessを設置しました。 ``` Redirect / "https://www.ドメイン名" RewriteEngine On RewriteCond %{HTTPS} off RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{THE_REQUEST} ^.*/index.html RewriteRule ^(.*)index.html$ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] ``` --- 想定していたのは、 1. http://ドメイン1 2. http://ドメイン1/index.html 3. http://www.ドメイン1/index.html 4. https://ドメイン1 5. https://www.ドメイン1/index.html 以上のアドレスに * wwwがつき * index.htmlは省略され * SSL対応(証明書は取得済み)のページに飛ぶ という動作です。 --- しかし現状 (2) http://ドメイン1/index.html (5) https://www.ドメイン1/index.html この2つだけ、 https://www.ドメイン名ドメイン1/public_html/ にアクセスしてしまいます。 (最初のRedirect宣言のせい?) --- htaccessの場所が悪いのか、内容が悪いのかもわからず行き詰まっています。 htaccessがいまいち理解できず、どうにも苦手で毎回悩んでいるのですがご指導のほどお願いいたします。
回答: RewriteRuleは正規表現に基づくフィルタリングです。そしてOR条件フラグが付与されていないので、 現状だと順番に累積のAND条件によって篩い分けられます。ただし、間が空いて、最後の条件だけ通過すると、それは通る現象が発生します。 ``` RewriteCond %{HTTPS} off RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] ``` (1)(2)(3)が通り、(4)と(5)が篩い落とされます。 ``` RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] ``` (4)と(5)はAで篩い落とされているので、`!^www`により、wwwが付かない(1)(2)が通り、(3)が篩い落とされます。 ``` RewriteCond %{THE_REQUEST} ^.*/index.html RewriteRule ^(.*)index.html$ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] ``` ここでは(3)だけが篩い落とされた状態で、Aで篩い落とされたはずの(4)と(5)も対象となり、(1)(2)(4)(5)に対し、index.htmlが存在するかどうかでフィルタリングされます。どうしてこうなるかは、下のリンクを参照してください。 (1)index.htmlで終わっていないので、篩い落とされます。 (2)Bを通過し、かつ**index.htmlで終わっている**ので通過します。 (3)Bで篩い落とされています。 (4)index.htmlで終わっていないので、篩い落とされます。 (5)Aで篩い落とされているのですが、**index.htmlで終わっている**ので通過します。 したがって、(2)と(5)だけが通る状態です。 この**どうしてこうなった**状態を回避するためには、AND条件ではなくOR条件にしてあげるといいと思います。 ``` RewriteCond %{HTTP_HOST} !^www\. [NC|OR] RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] ``` ●OR条件の参考リンク↓ Apache RewriteCond の基礎知識 ●処理振り分けの参考ページ .htaccess に RewriteRule 書くときは、[L]フラグをつけてもそこで終了しないかもよ?って話。