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

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

新規登録して質問してみよう
ただいま回答率
85.50%
URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

リダイレクト

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

.htaccess

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

Q&A

解決済

2回答

2206閲覧

htaccessによるリダイレクトがうまくいきません

退会済みユーザー

退会済みユーザー

総合スコア0

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

リダイレクト

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

.htaccess

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

0グッド

1クリップ

投稿2017/07/19 00:13

###前提・実現したいこと
URLを「wwwあり」かつ「https」にしたいです。

###発生している問題・エラーメッセージ
下記のパターンでうまくリダイレクトされません
http://www.example.jp

https://www.www.example.jpになってしまいます。

その他のパターンはうまくいっています。

###htaccessのコード

RewriteEngine on RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^(.*) https://www.%{HTTP_HOST}/$1 [R=301,L] RewriteEngine on RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

初歩的で申し訳ないのですが、ご教示いただけますと幸いです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

http://www.example.jp の場合には、https://www.example.jp にリダイレクトしたいのだろうと推測して、回答します。

「URLを「wwwあり」かつ「https」にしたい」を実現するために、
リダイレクトする前のURLが以下のどれに該当するかを判断して、それぞれに必要な処置(各行末の大括弧)をしなくてはいけません。

  1. ホストがwwwで始まっていて、http {httpをhttpsに変える}
  2. ホストがwwwで始まっていて、https {そのままで良い(何もしない)}
  3. ホストがwwwで始まっていなくて、http {ホストの前に"www."を追加し、httpをhttpsに変える}
  4. ホストがwwwで始まっていなくて、https {ホストの前に"www."を追加する}

<何が起きているのか>
質問のhtaccessの前半

RewriteEngine on RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^(.*) https://www.%{HTTP_HOST}/$1 [R=301,L]

で、3)と4)の場合(ホストがwwwで始まっていない)が、www.をホスト名の先頭に追加して、httpsにリダイレクトされるので、希望する動作になっています。

ところが、質問のhtaccessの後半

RewriteEngine on RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

で、1)の場合(ホストがwwwで始まっていて、http)に、www.をホスト名の先頭に追加して、httpsにリダイレクトされるので、ホスト名が wwww.www.で始まることになったわけです。

<解決策>
問題は、ホスト名がwwww.で始まっているかどうかを確認しないで、無条件にwww.を追加している事です。
これは、RewriteCondを使って「ホストがwwwで始まっていない」という条件を付け加えることで解決できます。(RewriteCondを複数書くと、全ての条件がそろっている場合(AND条件)にだけRewriteRuleが適用されます)

以下のように修正してみてください。

RewriteEngine on RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^(.*) https://www.%{HTTP_HOST}/$1 [R=301,L] RewriteEngine on RewriteCond %{HTTPS} off # 下の行を追加しました。 RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

投稿2017/07/19 01:04

coco_bauer

総合スコア6915

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

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

退会済みユーザー

退会済みユーザー

2017/07/19 05:01

回答ありがとうございます。 とても詳しく説明していただいたのですが、おそらく僕自身のサーバーの設定がよくないためか、 うまくいきませんでした。 サーバーの設定等を見直してみます。
guest

0

1つ目のルールは「hostnameの最初がwwwじゃなかった場合」「wwwを付ける」で
2つ目のルールは「httpsじゃなかった場合」「https://www. を付ける」なので、言葉で書いても問題がある事がわかりますよね?
2つ目のルールはhttpをhttpsにするだけにすればよい。
ただそうするとwww付きの条件が・・・となるのであれば、「Last」オプションを付けなければよいのでは。

RewriteEngine on RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^(.*) https://www.%{HTTP_HOST}/$1 [R=301] RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

これで、
「hostnameの最初がwwwじゃなかった場合」「wwwを付ける」
更に
「httpsじゃなかった場合」「https://でアクセスさせる」
の2つの条件となります。
Lオプションがないので、www有無の確認後にhttpsの確認も走るので、両対応出来ます。

投稿2017/07/19 01:01

kunai

総合スコア5405

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

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

退会済みユーザー

退会済みユーザー

2017/07/19 04:59

回答ありがとうございます。 .htaccessの記述を書き換えてみたのですが、うまくいきませんでした。 僕自身のサーバーの設定等がおかしいのかもしれません。
kunai

2017/07/19 05:34

うまく行かないというのがどういう状態なのか教えてください。 全く転送されないのか、転送はされるが期待された転送先ではないのか、等
退会済みユーザー

退会済みユーザー

2017/07/19 23:52

返信が遅れてしまい申し訳ありません。 初歩的なミスだったのですが、どうやらキャッシュが残っていたようで キャッシュを完全に削除したら上記の方法でうまくいきました。 ご迷惑をおかけいたしました。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問