总结 [OR]标志在不同的服务器上不一致。 下面的细节和问题。
我有一个Godaddy托pipe的网站,我编写了一个.htaccess文件的代码,将用户redirect到我的网站的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文件为networking解决scheme上托pipe的其他网站,它崩溃的网站。 它产生了这个错误。
此页面不起作用
www.secondsite.comredirect你太多次了。
ERR_TOO_MANY_REDIRECTS
我删除了networking解决scheme站点的[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]它不会根据第一个条件redirect, RewriteCond %{HTTPS} off 。 但是,它仍然基于第二个条件RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteCond %{HTTP_HOST} !^www\. [NC]
我不知道如何解决这个问题。 我需要[OR]但我不能使用它。 有没有办法使用[OR]不同或有这样的情况下的替代? 非常感谢!
不同服务器上的
[OR]标志不一致。
这是(几乎)不可能的。 OR标志是mod_rewrite中的基本构造/操作符。 如果这个结构工作不正常,那么你的服务器有一个严重的问题,需要重新安装或find一个新的主机。 这种情况是不可能的。
但是,更可能的是,OR或expression式中的一个操作数不是您所期望的。 即。 在这种情况下,服务器variablesHTTPS或HTTP_HOST任一个未按照您的预期设置。 而在这两者中,更有可能的是HTTPS服务器variables没有被设置(或者没有按照你的预期设置) – 就像我在我的评论中提到的那样。 这是非常“正常的”,取决于你的服务器configuration以及如何pipe理SSL证书。 例如。 如果您的SSL证书由前端代理(如CloudFlare)pipe理,那么HTTPS服务器variables可能未设置。 这似乎与你所看到的结果是一致的。
以下提示仅用于帮助初始debugging,以便find最终的解决scheme。
注意:在testing的同时,最好使用临时(302)redirect,而不是浏览器caching。 301(永久)redirect由浏览器caching,所以你必须确保caching被禁用,这使testing有问题。 请继续之前确保清除caching。
尝试(暂时)将其更改为HTTP到HTTPS(仅)redirect,即。 删除www的canonicalisation。 你还得到一个redirect循环? 例如:
RewriteCond %{HTTPS} off RewriteRule ^ https://www.example.com%{REQUEST_URI} [R,L]
( 另:无需在RewriteRule replace中转义点 – 这是一个普通的string,而不是正则expression式。)
如果以上触发redirect循环,则检查服务器variablesHTTPS包含的内容。 即。 删除上面的HTTP到HTTPSredirect,并添加以下内容:
RewriteRule ^foo$ /?HTTPS=%{HTTPS} [R,L]
并直接访问URL https://example.com/foo 。 您应该redirect到https://example.com/?HTTPS=<value> 。 什么是<value> ? ( <value>可能是空的。)
检查您的应用程序正在看到的HTTP请求标头。 如果使用PHP,请检查$_SERVER和$_ENV超全局数组,并特别检查索引HTTPS , SERVER_PORT , SCRIPT_URI和HTTP_X_FORWARDED_PROTO (对应于X-Forwarded-Proto头 – 如果设置的话)。 但是,也可能有其他的,特定于您的服务器。 例如,一些主机设置了一个名为HTTPS的环境variables (与同名的服务器variables相反)。 添加你发现你的问题。
如果你看到一个X-Forwarded-Proto请求头,那么你在一个前端代理的后面,像StackOverflow上的这个问题 。
也可以在专业网站pipe理员那里看到类似的“讨论”和最终的解决scheme这个问题 。
更新: …在networking解决scheme上托pipe的网站…
我刚刚做了一些关于“networking解决scheme”(NS)的挖掘,看来这可能是不可能的 ! 如果真的如此,我觉得这是非常惊人的,但是,我认为它仍然必须依赖于如何安装和什么types的SSL证书安装?
(仍然检查上面提到的HTTP请求头和服务器/脚本variables。)
但是, 有关SSLredirect的networking解决scheme支持文档指出:
NetworkSolutions®使用代理SSL,因此不允许使用服务器端variables来检测HTTPS(安全)。 所有服务器端编码将始终检测HTTP(非安全),对于试图将非安全连接(
http://)redirect到安全连接(https://)的程序将导致无限循环和服务器30秒后出错。您可以使用客户端程序(如javascript)来检测它是否安全,如果不是则redirect。 你可以使用下面的代码来创build一个redirect。 只需修改代码,使其redirect到正确的安全域,并将其添加到您可能具有的任何敏感页面的HTML中。
<script language="javascript"> if (document.location.protocol != "https:") { document.location.href = "https://subdomain.yourdomain.com" + document.location.pathname; }; </script>
“代理SSL”应该标识自己,或者至less在应用服务器的“代理”请求中标识HTTPS状态。 但是,这意味着它不。
另请参阅StackOverflow上的以下相关问题。 然而,在那里提出的“其他”解决scheme似乎不可行。 最终的结论似乎是对NS的上述支持文档(和JavaScript解决scheme)的参考。
https://stackoverflow.com/questions/4686668/https-redirect-for-network-solutions