htaccess https:// wwwへのリダイレクト


309

次のhtaccessコードがあります。

<IfModule mod_rewrite.c>

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

</IfModule>

サイトをhttps://www.HTTPSでリダイレクトし、www.サブドメインを適用したいのですが、http://www.(HTTPSなしで)アクセスするhttps://wwwと、HTTPSでリダイレクトされません。


する必要がありますRewriteCond %{HTTPS} =off
Michael Berkowski

1
そうすると、https:// ww ww w w
bigben

親愛なる@bigbenあなたはここで間違った答えを受け入れました!あなたは私の答えでそれが間違っている理由を見つけることができます。
アミールFo

回答:


632

最初にHTTPSを強制するには、正しい環境変数を確認する必要%{HTTPS} offがありますが、上記のルールは次に追加されwww.ますwww.

RewriteEngine On
RewriteCond %{HTTPS} off
# First rewrite to HTTPS:
# Don't put www. here. If it is already there it will be included, if not
# the subsequent rule will catch it.
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Now, rewrite any request to the wrong domain to use www.
# [NC] is a case-insensitive match
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

プロキシについて

クライアントがHTTPSを介してプロキシ、ロードバランサー、パッセンジャーアプリケーションなどに接続しているプロキシの一部の形式の背後にある場合、%{HTTPS}変数が決して存在せonず、書き換えループが発生する可能性があります。これは、クライアントとプロキシ/ロードバランサーがHTTPSを使用している場合でも、アプリケーションが実際にはプレーンHTTPトラフィックを受信して​​いるためです。このような場合X-Forwarded-Protoは、%{HTTPS}変数ではなくヘッダーを確認してください。この答えは適切なプロセスを示しています


14
場合によっては、証明書が単一のドメインに対してのみ有効な場合があります(たとえば、wwwで動作する可能性がありますが、そうでない場合は動作しません)。そのような場合は、まず正しいドメインにリダイレクトしてからhttpsにリダイレクトしてください。そうしないと、ブラウザーに証明書エラーメッセージが表示されます。
Nick Benson、

19
exaple.com/?bla=%20のRewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]ようなURL を使用すると、exaple.com/?bla= % 2520になります。つまり、パーセント記号がエンコードされています。フラグNEを使用して二重エンコードを防止することを検討してくださいRewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301]
ビート

5
これにより、1つのサーバーでリダイレクトループが発生し、別のサーバーで動作します。理由がわからない
user151496 '15

4
@ user151496失敗したサーバーは、ワニスキャッシュを通過する、またはPassengerに渡すなど、あらゆる種類のHTTPプロキシを使用しますか?その場合X-Forwarded-Protoは、%{HTTPS}変数ではなくヘッダーをチェックしてHTTPSを確認する必要がある場合があります。ループの原因となる部分、wwwまたはHTTPSの部分を言ったわけではありませんが、私が最初に頭に浮かぶのはそれです。
Michael Berkowski、2016年

5
厳密に言えば、上記の2つのルールの順序が間違っています。リクエストが受信された場合http://example.com(つまり、HTTPと非www)、二重リダイレクトが発生します。最初にhttps://example.com(最初のルール)、次にhttps://www.example.com(2番目のルール)。どちらのルールもHTTPSにリダイレクトされるため、これら2つのルールを逆にするだけでこれを修正できます。
MrWhite

148

Michalsの回答は私にとってはうまくいきましたが、1つの小さな変更があります。

問題:

あなたは持っている場合、単一サイトのセキュリティ証明書 // WWW:、httpsをせずに自分のページにアクセスしようとするブラウザを。安全な正しいhttpsページへのリダイレクトを受け取る前に、(または証明書がカバーしているドメインが)醜い赤い警告画面を表示します。

解決

最初にwww(または証明書でカバーされているドメイン)へのリダイレクトを使用してから、httpsリダイレクトを実行します。これにより、現在のURLに対応していない証明書がブラウザーに表示されるため、ユーザーがエラーに直面することがなくなります。

#First rewrite any request to the wrong domain to use the correct one (here www.)
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

#Now, rewrite to HTTPS:
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

5
+1の方がこのシナリオに適しているためですが、クライアントがにアクセスした場合に同じ問題が発生するのを防ぐことはできませんhttps://example.comが、ユーザーが入力する可能性が最も低い形式は、私の意見では+1 です。(受け入れられた回答にも同じ問題があります)
Joshua Goossen

@ラルザン:それは間違っています。2つの実際のリダイレクトを行うため、認証の例外が発生します。「[L、R = 301]」を「[R = 301]」に置き換えます。その後、ルールは中止されません。L = LAST
16

でのみ証明書https://を保持しwwwながら処理する必要がある場合はwww、このルールをソリューションに追加するRewriteCond %{HTTP_HOST} !^www\. RewriteCond %{HTTPS} on RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI}[L,R=301] だけです。http接続しようとしたときに戻って、https://example.com証明書エラーを回避します。
Eric Burel、2016年

1
要求時の二重リダイレクトhttp://example.com(HTTPとwwwなし)を防ぐために、2つのルールはとにかく(あなたが行ったように)逆にする必要があります
MrWhite

@EricBurelこの場合、証明書エラーを回避することはできません-コードが実行される前にSSLハンドシェイクが発生します(そもそもSSLの要です)。ブラウザーの認証エラーが発生する前にリダイレクトを実行できた場合は、リクエストがすでに安全でない接続を介して行われていることを意味します。これは、SSLモデルの根本的な障害となるでしょう。
MrWhite、2017

99

CloudFlareまたは同様のCDNを使用している場合、ここで提供されている%{HTTPS}ソリューションで無限ループエラーが発生します。CloudFlareユーザーの場合、これを使用する必要があります。

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

2
CloudFlareのサポートサイト上の現在のアドバイスを注意してくださいは若干異なります。support.cloudflare.com/hc/en-us/articles/...
ColinMcDermott

1
@ h0mayunに同意します。Cloudflareのアドバイスはリダイレクトループで結果を提供しますが、このコードは完全に機能します-ありがとうございます!
hobailey 2015年

2
私はec2でangularjsを実行しています。RewriteCond%{HTTPS}!= onを使用したソリューションでは、無限のリダイレクトが発生します(理由は完全にはわかりません)。X-Forwarded-Protoを使用したこのソリューションは、うまくいくようです。ありがとうございました!
マークワトキンス2016

3
私たちの環境に合わせて変更=http!=httpsました。 X-Forwarded-Protoヘッダーがhttpの場合は宣言されて!=httpsいなかったため、トリックも宣言しました。
Johnathan Elmore

この洞察をありがとう!なぜ機能し{HTTPS}なかったのかを理解するために何時間も費やしました。私が試した{ENV:HTTPS}とさえ{SERVER_PORT} 443、私はCloudFlareのカスタムHTTPリクエストヘッダをチェックするために必要なので、最終的にはそれがでした。
camslice

56

悪いソリューションとその理由

次のようなコードを使用している場合は、以下のソリューションを使用しないでください。

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

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

ブラウザは次の場所に移動します。

http://example.com

次にリダイレクトします:

https://example.com

次にリダイレクトします:

https://www.example.com

これはサーバーへの要求が多すぎます。

受け入れられたものでさえほとんどの答えはこの問題を抱えています。


最高のソリューションと回答

このコードには、[OR]URLでの二重変更を防ぐ条件があります!

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

3
「悪い解決策と理由」-それらのルールの順序が間違っています。これらの2つのルールを逆にすると、それが正しくなります。リダイレクトは2つではなく1つだけになります。
MrWhite

4
はい、指定されたコードでは2つのリダイレクトが発生します-異議はありません-私が言っているのは、この問題を解決するためにこれらのルールを逆にする必要があるだけで、他の変更は必要ありません。(「受け入れられた」答えは確かに間違っています-これはあなたが参照しているもののようです-ディレクティブの順序が間違っています。)
MrWhite

1
うん、@ AmirForsatiは正しい。それは2回リダイレクトしており、これが受け入れられる答えであるはずです。
ザキルフセイン

4
あなたがドメイン名の変数を保持したい場合は、これを使用することができます:RewriteEngine On RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{HTTPS} off RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
I.devries

これは私をwp-content/cache/page_enhanced/次にリダイレクトします。どうすれば修正できますか?編集:を上部に配置する必要があるようです.htaccess。スクリプトをありがとう:)
ジャコモ

35

これは、プロキシユーザーではなく、プロキシ用に見つけた最良の方法です

RewriteEngine On

### START WWW & HTTPS

# ensure www.
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# ensure https
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

### END WWW & HTTPS

2
正解 これは、私がプロキシユーザーではなく、プロキシに対して見つけた最良の方法 +1
Deep 3015

1
これは複数の301リダイレクトを解決するため、最良の方法です
Niraj Chauhan

1
史上最高のソリューション。
SM Jobayer Alam 2018

1
すばらしい答えです。これは私のために働いた唯一のものです。Cloudflareの背後にいる場合に機能します(ただし、Cloudflareにはページルールが設定されていません)。
jasonco

私のすべてのケースで機能する唯一のソリューション。しかし、もし私がde opositeを実行して、すべての「www」を削除したい場合はどうでしょうか。
FedeKrum

27

そこには多くの解決策があります。これは、この問題に直接対処するapache wikiへのリンクです。

http://wiki.apache.org/httpd/RewriteHTTPToHTTPS

RewriteEngine On
# This will enable the Rewrite capabilities

RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS

RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
# This rule will redirect users from their original location, to the same location but using HTTPS.
# i.e.  http://www.example.com/foo/ to https://www.example.com/foo/
# The leading slash is made optional so that this will work either in httpd.conf
# or .htaccess context

私はからの書き換え条件変更によって発見 RewriteCond %{HTTPS} offするRewriteCond %{HTTPS} !=onことリダイレクトは常に起こる、これは私には良い答えです。
Samuel Hawksby-Robinson

この解決策は正解として受け入れられるべきです!私も働いた!
AndrewShmig 2018

11

http://またはhttps://https:// wwwにリダイレクトするには、すべてのバージョンのapacheで次のルールを使用できます。

RewriteEngine on

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.example.com%{REQUEST_URI} [NE,L,R]

Apache 2.4

RewriteEngine on

RewriteCond %{REQUEST_SCHEME} http [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.example.com%{REQUEST_URI} [NE,L,R]

%{REQUEST_SCHEME}変数は、Apache 2.4以降で使用できます。


1
問題!:HTTP_HOSTにすでにwwwが含まれている場合。しかし、スキームはHTTPSではないため、www.wwwになります。あなたのホストで。
Jpsy 2016年

@Jpsyあなたは正しい。リダイレクト先を更新しました。ご入力いただきありがとうございます。
starkeen

1
これはほとんど私が探していたものですが、他の例のようにドメインを汎用的なものにしたいです。出来ますか?
cronoklee 2016年

8

CloudFlareを使用している場合は、必ずこのようなものを使用してください。

# BEGIN SSL Redirect
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
# END SSL Redirect

これにより、リダイレクトループから解放され、サイトを安全にSSLにリダイレクトします。

PS mod_rewrite.cを確認することをお勧めします!


https:// theurlwithoutwww.comをhttps:// wwwにリダイレクトしません。
テセレントセドロイド

これは実際に、事前に「add www」ディレクティブがいくつかある場合にのみ有効なソリューションです。他の解決策は私に「多くのリダイレクトへ」を与えます。
Daniel.P。


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

注:次の手順を実行したことを確認してください

  1. sudo a2enmod rewrite
  2. sudoサービスapache2再起動
  3. /etc/apache2/sites-available/000-default.confにあるvhostファイルに以下を追加します
<Directory /var/www/html>
  Options Indexes FollowSymLinks MultiViews
  AllowOverride All
  Order allow,deny
  allow from all
  Require all granted
</Directory>

これで.htaccessが機能し、サイトはhttp://からhttps:// wwwにリダイレクトされます



0

.htaccessファイルに設定する

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


-2

私は最初の答えを試してみましたが、うまくいきません...この仕事:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{ENV:HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.