我有以下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。


当前回答

michal的回答对我很有效,尽管做了一个小小的修改:

问题:

当您只有一个站点安全证书时,浏览器试图访问您的页面而没有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]

其他回答

这是我为代理用户和非代理用户找到的最好的方法

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

要首先强制使用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}变量可能永远不会打开,并导致重写循环。这是因为即使客户端和代理/负载均衡器使用的是HTTPS,应用程序实际上接收的是纯HTTP流量。在这些情况下,检查X-Forwarded-Proto报头,而不是%{HTTPS}变量。这个答案显示了适当的过程

我试着第一个回答,它不工作… 这项工作:

<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

我使用了下面的代码从这个网站,它工作得很好https://www.freecodecamp.org/news/how-to-redirect-http-to-https-using-htaccess/

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

希望能有所帮助

michal的回答对我很有效,尽管做了一个小小的修改:

问题:

当您只有一个站点安全证书时,浏览器试图访问您的页面而没有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]