提问人:bigben 提问时间:12/21/2012 最后编辑:Michael Berkowskibigben 更新时间:5/4/2023 访问量:633858
htaccess重定向至 https://www
htaccess redirect to 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)时,它不会使用 HTTPS 将我重定向到。https://www.
www.
http://www.
https://www
答:
要首先强制执行 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 连接到代理、负载平衡器、Passenger 应用程序等,该变量可能永远不会存在并导致重写循环。这是因为即使客户端和代理/负载均衡器使用 HTTPS,应用程序实际上也会接收纯 HTTP 流量。在这些情况下,请检查标头而不是变量。此答案显示了相应的过程%{HTTPS}
on
X-Forwarded-Proto
%{HTTPS}
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]
那里有很多解决方案。这是直接处理此问题的 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
如果您使用的是 CloudFlare 或类似的 CDN,则此处提供的 %{HTTPS} 解决方案将出现无限循环错误。如果您是 CloudFlare 用户,则需要使用以下功能:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
要将 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 开始可用。
如果您使用的是 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,这是一个好主意!
评论
这是我为代理而不是代理用户找到的最佳方式
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
评论
糟糕的解决方案及其原因
永远不要使用下面的解决方案,因为当你使用他们的代码时,就像这样:
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]
评论
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]
在您的 .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]
我尝试第一个答案,但它不起作用...... 这项工作:
<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
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
注意:确保您已完成以下步骤
- sudo a2enmod 重写
- sudo 服务 apache2 重启
- 在位于 /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
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R]
与 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]
我使用了这个网站的以下代码,它效果很好 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]
希望对您有所帮助
评论
RewriteCond %{HTTPS} =off
https
www