質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.62%

.htaccessでのリダイレクトがうまくいかない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 963

xminimx

score 51

さくらインターネットサーバーを利用しており、
下記のようなディレクトリで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がいまいち理解できず、どうにも苦手で毎回悩んでいるのですがご指導のほどお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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]フラグをつけてもそこで終了しないかもよ?って話。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/07 14:17

    回答ありがとうございます。
    フィルタリングにかけられ、順番に外されていくのは初めて知ったので非常に勉強になりました。
    しかし今回は、一度htaccessを削除しても同様の症状が出てしまうので
    そもそもディレクトリが間違っているのかな?と考えています。

    https://engineer-milione.com/create/sakura-htaccess.html#4
    こちらを参照していたところ、wwwありとなしを分ける必要があるとのことだったので、この通りにドメインを設定し直し、
    ご指導いただいた[NC|OR]を使いながら試してみます。

    キャンセル

  • 2019/11/07 14:33 編集

    > 一度htaccessを削除しても同様の症状が出てしまう
    都度ブラウザキャッシュをクリアして確認されてますか?
    .htaccessの動作を確認する場合は必ずブラウザキャッシュをクリアして確認してください。
    でないと変更前の.htaccessの時のレスポンスがブラウザキャッシュから参照されてしまい
    変更後の確認ができません。

    キャンセル

  • 2019/11/07 15:08

    検証はキャッシュが残らないシークレットウインドウで行なっております。
    また、今回は参照ディレクトリやhtaccessの保存場所がおかしかったようで
    上のサイトに従いながらそれを設定し直したらhtaccessが効くようになりました。
    その際、教えていただいた条件付けも一緒に記述したところ思い通りの動作をするようになりました。
    出していただいたリンクもあわせ、とても参考になりました。
    ありがとうございました。

    キャンセル

  • 2019/11/07 15:14

    > 検証はキャッシュが残らないシークレットウインドウで行なっております
    毎回シークレットウィンドウを閉じて、開き直して確認されているということですね。

    とにかく解決されて何よりです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る