尝试强制使用 WWW 和 HTTPS,但三条规则中只有两条有效

尝试强制使用 WWW 和 HTTPS,但三条规则中只有两条有效

对我来说不起作用。我做错了什么,我得到了可怕的重定向过多错误。我试图将所有网址强制为 WWW 和 https,但我只满足于能够强制所有内容为 https

    RewriteEngine on
    RewriteBase /

    RewriteCond %{http_host} ^all-service-musical.com [nc]
    RewriteRule ^(.*)$ https://www.all-service-musical.com/$1 [r=301,nc]

    RewriteCond %{http_host} ^asmusic.org [nc]
    RewriteRule ^(.*)$ https://www.all-service-musical.com/$1 [r=301]

    RewriteCond %{http_host} ^www.all-service-musical.com [nc]
    RewriteRule ^(.*)$ https://www.all-service-musical.com/$1 [r=301,nc]

前两个规则一起工作得很好,但第三个规则试图将 www url 更改为 https 却破坏了整个规则....有什么想法吗?

我还尝试删除上述所有代码,并尝试使用以下命令完成 http 到 https 部分任务:

RewriteEngine On
#RewriteCond %{HTTPS} off
#RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

当使用上述方法时,我也遇到了过多重定向错误。

我也单独尝试过这个:

RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://all-service-musical.com/$1 [R,L]

同样的结果...由于过多的重定向错误导致网站崩溃。

MrWhite...谢谢您抽出时间回答,htaccess 文件中当前的代码是:

RewriteEngine on
RewriteBase /
RewriteCond %{http_host} ^www.all-service-musical.com [nc]
RewriteRule ^(.*)$ https://all-service-musical.com/$1 [r=301,nc]

RewriteCond %{http_host} ^asmusic.org [nc]
RewriteRule ^(.*)$ https://all-service-musical.com/$1 [r=301]

RewriteCond %{http_host} ^www.asmusic.org [nc]
RewriteRule ^(.*)$ https://all-service-musical.com/$1 [r=301] 

由于该证书适用于 all-service-musical.com(我开始怀疑这样设置是否是托管公司给出的错误建议),我想我会尝试重写代码,以便非 WWW 版本成为目标,但是我仍然有同样的问题,当我在地址栏中输入 all-service-musical.com 时,它显示为不安全的,当我拥有最初发布的代码时,直接输入 WWW 版本会显示为不安全的。

我不得不认为您提供的这段代码:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=302,L]

如果删除所有其他内容,则在一定程度上应该可以自行运行,但即使它是 htaccess 文件中唯一的东西,它也会因过多的重定向错误而破坏网站。

我非常喜欢并感谢您的建议,在找到正确的代码之前,我建议使用 302 重定向。如果您能就我的问题所在提供进一步的建议,我将不胜感激。

答案1

如果在尝试所有这些指令时持续出现重定向循环,请清除浏览器缓存。全部这些不应该触发重定向循环。出于这个原因,建议使用 302(临时)重定向进行测试,并且只有当您确定它们正常工作时才更改为 301(永久)。

RewriteCond %{http_host} ^all-service-musical.com [nc]
RewriteRule ^(.*)$ https://www.all-service-musical.com/$1 [r=301,nc]

RewriteCond %{http_host} ^asmusic.org [nc]
RewriteRule ^(.*)$ https://www.all-service-musical.com/$1 [r=301]

RewriteCond %{http_host} ^www.all-service-musical.com [nc]
RewriteRule ^(.*)$ https://www.all-service-musical.com/$1 [r=301,nc]

您的前三个RewriteRule指令都缺少L标志,因此处理将继续到下一个规则等。您的第三条规则尝试“将 www 网址更改为 https”,这肯定会导致重定向循环,因为您只是重定向到其自身。要从 HTTP 重定向到 HTTPS,您需要首先检查 HTTP(即HTTPSis off),就像您在后面的尝试中所做的那样。

RewriteEngine On
#RewriteCond %{HTTPS} off
#RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

您的第四条规则重定向到同一主机上的 HTTPS - 这可能是一个好主意,只要您的不同域(您只有两个吗?)都安装了安全证书。

RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://all-service-musical.com/$1 [R,L]

这是重定向到域名顶点,而不是 www 子域名(与前三条规则相反)。如果网站代码本身发出了到规范主机的重定向,则可能会导致重定向循环。

假设:

  • 您有一个单一的规范主机名www.all-service-musical.com,所有其他域都重定向到该主机名。
  • SSL 证书直接安装在您的应用程序服务器上,不由前端代理管理。
  • 您没有实施 HSTS。(如果实施,则需要先在同一主机上重定向到 HTTPS,并确保在每个域上都安装了 SSL 证书。)

请尝试在文件顶部附近执行以下操作.htaccess

RewriteEngine On

# Redirect non-canoncial hostname
RewriteCond %{HTTP_HOST} !^www\.all-service-musical\.com$
RewriteRule (.*) https://www.all-service-musical.com/$1 [R=302,L]

# Redirect to HTTPS
# NB: This only applies if the canonical hostname is requested over HTTP
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=302,L]

如上所述,只有在确认其正常运行后才将 302 更改为 301 - 以避免浏览器缓存出现问题。

相关内容