概括此[OR]
标志在不同服务器上的工作方式不一致。详细信息和问题如下。
我有一个在 GoDaddy 上托管的网站,我为一个.htaccess
文件编写了此代码,用于将用户重定向到https
我的网站版本。效果很好。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www\.firstsite\.com%{REQUEST_URI} [R=301,L]
</IfModule>
我将同一个.htaccess
文件用于 Network Solutions 上托管的另一个网站,结果导致该网站崩溃。产生了此错误。
此页面无法运行
www.secondsite.com 将您重定向过多次。
错误信息
我删除了[OR]
网络解决方案站点的标志,站点加载时没有出现错误。这是更新后的代码。
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www\.secondsite\.com%{REQUEST_URI} [R=301,L]
</IfModule>
不幸的是,如果没有,[OR]
它不会根据第一个条件重定向RewriteCond %{HTTPS} off
。但是它仍然会根据第二个条件重定向RewriteCond %{HTTP_HOST} !^www\. [NC]
我不知道该如何解决这个问题。我需要,[OR]
但我不能使用它。有没有[OR]
其他方法可以使用,或者有其他替代方法可以解决这种情况?非常感谢!
答案1
该
[OR]
标志在不同的服务器上不能一致地起作用。
这(几乎)是不可能的。该OR
标志是 mod_rewrite 中的一个基本构造/操作符。如果此构造无法正常工作,则说明您的服务器存在严重问题,需要重新安装或寻找新主机。这种情况极不可能发生。
但是,更有可能的是,OR 表达式中的一个操作数不符合您的预期。即,在这种情况下,服务器变量之一HTTPS
或HTTP_HOST
未按预期设置。在这两种情况下,更有可能的是HTTPS
服务器变量未设置(或未按预期设置) - 正如我在评论中提到的那样。这很“正常”,取决于您的服务器配置以及 SSL 证书的管理方式。例如,如果您的 SSL 证书由前端代理(如 CloudFlare)管理,则服务器变量HTTPS
可能未设置。这似乎与您看到的结果一致。
调试
以下提示只是为了帮助进行初步调试以便找到最终的解决方案。
注意:测试时,最好使用临时(302)重定向,因为浏览器不会缓存这些重定向。301(永久)重定向会被浏览器硬性缓存,因此您必须确保禁用缓存,否则测试会很麻烦。请确保清除缓存后再继续。
尝试(暂时)将其更改为 HTTP 到 HTTPS(仅)重定向,即删除 www 规范化。您仍然遇到重定向循环吗?例如:
RewriteCond %{HTTPS} off RewriteRule ^ https://www.example.com%{REQUEST_URI} [R,L]
(在旁边:无需在
RewriteRule
代换- 这是一个普通字符串,而不是正则表达式。)如果上述操作触发了重定向循环,则检查服务器变量
HTTPS
包含的内容。即删除上述 HTTP 到 HTTPS 重定向并添加以下内容:RewriteRule ^foo$ /?HTTPS=%{HTTPS} [R,L]
并直接访问 URL
https://example.com/foo
。您应该被重定向到https://example.com/?HTTPS=<value>
。是什么<value>
?(<value>
可能为空。)检查 HTTP 请求标头应用正在看到。如果您使用的是 PHP,请检查
$_SERVER
和$_ENV
超全局数组,并特别检查索引HTTPS
、SERVER_PORT
和SCRIPT_URI
(HTTP_X_FORWARDED_PROTO
对应于X-Forwarded-Proto
标头 - 如果已设置)。但是,可能还有其他特定于您的服务器的索引。例如,某些主机设置了环境变量称为HTTPS
(而不是同名的服务器变量)。将您找到的内容添加到您的问题中。如果你看到
X-Forwarded-Proto
请求标头,则说明你位于前端代理后面,例如StackOverflow 上的这个问题。
也可以看看Pro Webmasters 上的这个问题进行类似的“讨论”并最终找到解决方案。
更新:... 托管于网络解决方案...
我刚刚对“网络解决方案”(NS)进行了一些研究,似乎这可能不是可能的!? 如果这是真的,我会觉得非常震惊,但是我认为这仍然取决于如何安装以及安装哪种类型的 SSL 证书?
(仍然检查上面提到的 HTTP 请求标头和服务器/脚本变量。)
但是,那Network Solutions 关于 SSL 重定向的支持文档状态:
Network Solutions® 使用代理 SSL,因此不允许使用服务器端变量来检测 HTTPS(安全)。所有服务器端编码将始终检测 HTTP(非安全),对于尝试将非安全连接 (
http://
) 重定向到安全连接 (https://
) 的程序,将在 30 秒后导致无限循环和服务器错误。您可以使用客户端程序(如 javascript)来检测它是否安全,如果不安全则重定向。您可以使用以下代码来创建重定向。只需修改代码,使其重定向到正确的安全域,并将其添加到您可能拥有的任何敏感页面的 HTML 中。
<script language="javascript"> if (document.location.protocol != "https:") { document.location.href = "https://subdomain.yourdomain.com" + document.location.pathname; }; </script>
“代理 SSL” 应该标识自身,或者至少在向应用服务器发送的“代理”请求中标识 HTTPS 状态。然而,这意味着它没有标识。
另请参阅 StackOverflow 上的以下相关问题。但是,在我看来,那里提出的“其他”解决方案似乎不可行。最终结论似乎是对 NS 的上述支持文档(和 JavaScript 解决方案)的引用。
https://stackoverflow.com/questions/4686668/https-redirect-for-network-solutions
答案2
这是使用 Networksolutions 重定向的唯一干净方法。我花了几个小时进行测试。最适合 SEO。Network Solutions 是一个具有挑战性的托管平台。
这个 .htaccess 可以工作,您需要做的就是将其替换changeexample.com
为您的域名。很简单。
## Base Redirects ##
# Turn on Rewrite Engine
RewriteEngine On
# Remove trailing slash from non-filepath urls
RewriteCond %{REQUEST_URI} /(.+)/$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ https://changeexample.com/%1 [R=301,L]
# Include trailing slash on directory
RewriteCond %{REQUEST_URI} !(.+)/$
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+)$ https://changeexample.com/$1/ [R=301,L]
# Force HTTPS and remove WWW
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [OR,NC]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://changeexample.com/$1 [R=301,L]