324

我有以下 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 将我重定向到。

4

14 回答 14

658

要首先强制 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}变量。这个答案显示了适当的过程

于 2012-12-21T21:34:26.717 回答
155

Michals 的回答对我有用,尽管做了一点小小的修改:

问题:

当您拥有单一站点安全证书时,浏览器会尝试在没有 https://www 的情况下访问您的页面。(或您的证书涵盖的任何域)将在接收重定向到安全且正确的 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]
于 2013-10-22T05:48:52.543 回答
101

如果您使用 CloudFlare 或类似的 CDN,您将收到此处提供的 %{HTTPS} 解决方案的无限循环错误。如果你是 CloudFlare 用户,你需要使用这个:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
于 2014-11-13T23:30:44.643 回答
63

糟糕的解决方案,为什么!

永远不要使用下面的解决方案,因为当您使用他们的代码时,类似于:

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]
于 2017-03-27T17:22:53.813 回答
39

这是我为代理而不是代理用户找到的最佳方式

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
于 2016-09-09T16:09:30.157 回答
28

有很多解决方案。这是直接处理此问题的 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
于 2014-05-23T07:47:33.943 回答
12

要将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]

阿帕奇 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起即可使用。

于 2016-04-27T03:40:16.220 回答
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 是个好主意!

于 2016-07-10T04:52:41.607 回答
4
RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R]
于 2018-12-14T14:05:38.513 回答
2
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

注意:确保您已完成以下步骤

  1. sudo a2enmod 重写
  2. sudo 服务 apache2 重启
  3. 在您的 vhost 文件中添加以下内容,位于 /etc/apache2/sites-available/000-default.conf
<Directory /var/www/html>
  Options Indexes FollowSymLinks MultiViews
  AllowOverride All
  Order allow,deny
  allow from all
  Require all granted
</Directory>

现在您的 .htaccess 将工作,您的网站将重定向到 http:// 到https://www

于 2018-09-07T21:41:13.750 回答
1

类似于 Amir Forsati 的解决方案htaccess 重定向到 https://www但对于可变域名,我建议:

RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%2%{REQUEST_URI} [R=301,L]
于 2019-09-27T08:22:25.853 回答
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]
于 2017-07-25T14:17:22.500 回答
0

我使用了本网站的以下代码,效果很好https://www.freecodecamp.org/news/how-to-redirect-http-to-https-using-htaccess/

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.yourdomain.com/$1 [R,L]

希望能帮助到你

于 2020-05-19T13:14:02.077 回答
-1

我尝试第一个答案,但它不起作用......这项工作:

<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
于 2018-08-30T14:45:25.407 回答