为什么我的 no-www 和 https 的 htaccess 不起作用?

Why my htaccess for no-www and https doesn't work?

我的 .htaccess 文件有问题。我想将 no-www 重定向到 www,将 HTTP 重定向到 HTTPS。

我试过这些文件,但它们不起作用...

RewriteEngine On  
RewriteCond %{HTTP_HOST} ^www.example.com$
RewriteRule ^(.*) http://www.example.com/ [QSA,L,R=301]

RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [QSA,R=301,L]

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://www.example.com/ [L,R=301] 

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.example.com/ [L,R=301]

你能帮帮我吗?

最初的问题是 .htaccess 文件未在服务器配置中启用。在服务器配置中设置 AllowOverride All 以启用 .htaccess 文件后,这导致了重定向循环...

您遇到重定向循环,因为 HTTPS 服务器变量在请求 HTTPS 时报告 "off"。这意味着您有一个正在处理 SSL 连接的 front-end 代理,并且 X-Forwarded-Proto HTTP 请求 header(您的应用程序服务器看到的)设置为"https"。 (X-Forwarded-Proto header 由代理服务器在请求通过时设置。)

这意味着此代理与您的应用程序服务器之间的 "private" 连接是通过普通 HTTP 建立的。但是代理和客户端之间的连接是通过 HTTPS 保护的。这不一定是个问题,但这意味着您需要调整指令以检查 X-Forwarded-Proto HTTP 请求 header 而不是 HTTPS 服务器变量。

例如:

RewriteEngine On

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://www.example.com/ [R=301,L] 

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.example.com/ [R=301,L]

确保在测试前清除浏览器缓存。通常最好使用 302(临时)重定向进行测试,只有在您确定它工作正常时才更改为 301(永久)- 以避免缓存问题。