🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
さくらのレンタルサーバ

さくらのレンタルサーバとは、格安サーバーで知られるさくらインターネット社の提供する共有レンタルサーバー。Webサイトの構築から簡単なプログラミングまで幅広く利用することができ、プランが多いことも特徴です。

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

リダイレクト

プログラムの入力元や出力先を通常とは別の場所に転送させることをリダイレクトと呼びます。

.htaccess

Apacheウェブサーバーにおいて、ディレクトリ単位で設置及び設定を行う設定ファイルを指します。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

903閲覧

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

xminimx

総合スコア53

さくらのレンタルサーバ

さくらのレンタルサーバとは、格安サーバーで知られるさくらインターネット社の提供する共有レンタルサーバー。Webサイトの構築から簡単なプログラミングまで幅広く利用することができ、プランが多いことも特徴です。

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

リダイレクト

プログラムの入力元や出力先を通常とは別の場所に転送させることをリダイレクトと呼びます。

.htaccess

Apacheウェブサーバーにおいて、ディレクトリ単位で設置及び設定を行う設定ファイルを指します。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

1グッド

0クリップ

投稿2019/11/07 01:20

さくらインターネットサーバーを利用しており、
下記のようなディレクトリで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を設置しました。

htaccess

1Redirect / "https://www.ドメイン名" 2RewriteEngine On 3RewriteCond %{HTTPS} off 4RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 5RewriteCond %{HTTP_HOST} !^www. [NC] 6RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 7RewriteCond %{THE_REQUEST} ^.*/index.html 8RewriteRule ^(.*)index.html$ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

想定していたのは、
0. http://ドメイン1
0. http://ドメイン1/index.html
0. http://www.ドメイン1/index.html
0. https://ドメイン1
0. 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がいまいち理解できず、どうにも苦手で毎回悩んでいるのですがご指導のほどお願いいたします。

FKM👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

RewriteRuleは正規表現に基づくフィルタリングです。そしてOR条件フラグが付与されていないので、
現状だと順番に累積のAND条件によって篩い分けられます。ただし、間が空いて、最後の条件だけ通過すると、それは通る現象が発生します。

A

1RewriteCond %{HTTPS} off 2RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

(1)(2)(3)が通り、(4)と(5)が篩い落とされます。

B

1RewriteCond %{HTTP_HOST} !^www. [NC] 2RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

(4)と(5)はAで篩い落とされているので、!^wwwにより、wwwが付かない(1)(2)が通り、(3)が篩い落とされます。

C

1RewriteCond %{THE_REQUEST} ^.*/index.html 2RewriteRule ^(.*)index.html$ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 3

ここでは(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 02:33

編集2019/11/07 02:54
FKM

総合スコア3647

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xminimx

2019/11/07 05:17

回答ありがとうございます。 フィルタリングにかけられ、順番に外されていくのは初めて知ったので非常に勉強になりました。 しかし今回は、一度htaccessを削除しても同様の症状が出てしまうので そもそもディレクトリが間違っているのかな?と考えています。 https://engineer-milione.com/create/sakura-htaccess.html#4 こちらを参照していたところ、wwwありとなしを分ける必要があるとのことだったので、この通りにドメインを設定し直し、 ご指導いただいた[NC|OR]を使いながら試してみます。
Y.H.

2019/11/07 05:35 編集

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

2019/11/07 06:08

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

2019/11/07 06:14

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問