htaccess重定向至 https://www

htaccess redirect to https://www

提问人:bigben 提问时间:12/21/2012 最后编辑:Michael Berkowskibigben 更新时间:5/4/2023 访问量:633858

问:

我有以下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)时,它不会使用 HTTPS 将我重定向到。https://www.www.http://www.https://www

apache .htaccess mod-rewrite 重定向 https

评论

0赞 Michael Berkowski 12/21/2012
应该是RewriteCond %{HTTPS} =off
1赞 bigben 12/22/2012
如果我这样做,它会重定向到 h t t p s : / / w w w.w w w。
0赞 Amir Fo 8/21/2018
亲爱的@bigben你在这里接受了错误的答案!你可以在我的回答中找到为什么它错了。
0赞 Amit Verma 6/13/2021
另请参阅此“强制执行并在一个 301 重定向中”helponnet.com/2021/03/23/...httpswww

答:

667赞 Michael Berkowski 12/22/2012 #1

要首先强制执行 HTTPS,您必须检查正确的环境变量,但上面的规则会附加 由于您有第二条规则要强制执行 ,请不要在第一个规则中使用它。%{HTTPS} offwww.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 连接到代理、负载平衡器、Passenger 应用程序等,该变量可能永远不会存在并导致重写循环。这是因为即使客户端和代理/负载均衡器使用 HTTPS,应用程序实际上也会接收纯 HTTP 流量。在这些情况下,请检查标头而不是变量。此答案显示了相应的过程%{HTTPS}onX-Forwarded-Proto%{HTTPS}

155赞 Larzan 10/22/2013 #2

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]
28赞 Vynz 5/23/2014 #3

那里有很多解决方案。这是直接处理此问题的 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
101赞 Andrew 11/14/2014 #4

如果您使用的是 CloudFlare 或类似的 CDN,则此处提供的 %{HTTPS} 解决方案将出现无限循环错误。如果您是 CloudFlare 用户,则需要使用以下功能:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
12赞 Amit Verma 4/27/2016 #5

要将 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 开始可用。

8赞 Ahmad Awais 7/10/2016 #6

如果您使用的是 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,这是一个好主意!

评论

0赞 thesearentthedroids 7/21/2016
它不会重定向 https : // theurlwithoutwww.com 到 https : // www.
0赞 Daniel.P. 7/4/2017
这实际上只有在您事先有一些“添加 www”指令时才有效。其他解决方案给了我“许多重定向”。
40赞 llioor 9/10/2016 #7

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

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赞 Deep 3015 9/11/2017
正确:这是我为代理而不是代理用户找到的最佳方式 +1
1赞 Niraj Chauhan 10/3/2017
这是最好的,因为它解决了多个 301 重定向
2赞 S M Jobayer Alam 9/30/2018
有史以来最好的解决方案。
1赞 jasonco 1/6/2019
很好的答案。这是唯一对我有用的。如果您在 Cloudflare 后面,则有效(尽管我在 Cloudflare 上没有设置页面规则)。
0赞 FedeKrum 5/7/2020
唯一适用于我所有案例的解决方案。但是,如果我想做 de 相反并删除所有“www”怎么办。
67赞 Amir Fo 3/28/2017 #8

糟糕的解决方案及其原因

永远不要使用下面的解决方案,因为当你使用他们的代码时,就像这样:

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]

评论

4赞 MrWhite 9/23/2017
“糟糕的解决方案和原因!” - 这些规则只是顺序错误。颠倒这两个规则,这将是正确的 - 你只会得到一个重定向,而不是两个。
6赞 MrWhite 9/24/2017
是的,给定的代码会导致 2 次重定向 - 我不是在争辩 - 我要说的是,您只需要反转这些规则即可解决此问题,无需进行其他更改。(“接受”的答案确实不正确 - 这似乎是你所指的 - 指令的顺序错误。
1赞 Zakir hussain 8/20/2018
是的,@AmirForsati是对的。它重定向了两次,这应该是公认的答案。
4赞 I.devries 9/10/2018
如果要保留 domainname 变量,可以使用此功能: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]
1赞 MrWhite 10/9/2022
第一种解决方案不一定是“坏的”,如果您正在实施 HSTS,实际上是正确的解决方案。在这种情况下,您需要先在同一主机上从 HTTP 重定向到 HTTPS,然后再规范主机名(即将非 www 重定向到 www)。在实施 HSTS 时,您无法避免潜在的双重重定向,但这只是一种极端情况,并且仅在用户第一次访问时发生(在保存 HSTS 凭据之前)。
0赞 Adam Kozlowski 7/25/2017 #9

在您的 .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]
-1赞 Jackssn 8/30/2018 #10

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

<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
2赞 Kundan roy 9/8/2018 #11
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 文件中添加 Following。
<Directory /var/www/html>
  Options Indexes FollowSymLinks MultiViews
  AllowOverride All
  Order allow,deny
  allow from all
  Require all granted
</Directory>

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

4赞 Анастасия Ермолик 12/14/2018 #12
RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R]
2赞 Bernhard Bodenstorfer 9/27/2019 #13

与 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]
0赞 muya.dev 5/19/2020 #14

我使用了这个网站的以下代码,它效果很好 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]

希望对您有所帮助