web-dev-qa-db-ja.com

htaccessはhttps:// wwwにリダイレクトします

以下の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でhttps://www.にリダイレクトし、www.サブドメインを強制したいのですが、(HTTPSなしで)http://www.にアクセスしても、HTTPSでhttps://wwwにリダイレクトされません。

281
bigben

最初にHTTPSを強制するには、正しい環境変数%{HTTPS} offを確認する必要がありますが、上の規則の後にwww.が追加されます。www.を強制するための規則が2つあるため、最初の規則では使用しないでください。

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を介してプロキシ、ロードバランサー、Passengerアプリケーションなどに接続しているプロキシの形式の背後にある場合、%{HTTPS}変数は決してonであり、書き換えループを引き起こすことはありません。これは、クライアントとプロキシ/ロードバランサがHTTPSを使用していても、アプリケーションが実際には単純なHTTPトラフィックを受信して​​いるためです。このような場合は、X-Forwarded-Proto変数の代わりに%{HTTPS}ヘッダーを確認してください。 この答えは適切なプロセスを示しています

577

Michalsの答えは私のために働きましたが、1つの小さな修正があります。

問題:

単一サイトセキュリティ証明書 を持っている場合、https:// wwwなしであなたのページにアクセスしようとします。 (または証明書がカバーするドメインにかかわらず)醜い赤い警告画面が表示されます before 安全で正しい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]
142
Larzan

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

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

悪い解決策となぜ!

これらのコードを使用しているときは、次のようなものであるため、上記の解決策を使用しないでください。

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

これは多すぎる リクエスト サーバーへ


最良の解決策とその答え

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

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

答えのほとんどは1つを受け入れました、このトリックを使わないでください。

47
Amir Forsati

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

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
30
llioor

そこにたくさんの解決策があります。これは、この問題を直接扱う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
25
Vynz

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 以来使用可能であることに注意してください。

10
starkeen

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にリダイレクトします。

P.S mod_rewrite.cをチェックしてください。

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

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

  1. Sudo a2enmodの書き換え
  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

1
Kundan roy

私は最初の答えを試してもうまくいきません...この作品:

<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
0
Jackssn
RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R]

.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]
0
Adam Kozlowski