如何使用或replace.htaccess文件?

总结 [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式中的一个操作数不是您所期望的。 即。 在这种情况下,服务器variablesHTTPSHTTP_HOST任一个未按照您的预期设置。 而在这两者中,更有可能的是HTTPS服务器variables没有被设置(或者没有按照你的预期设置) – 就像我在我的评论中提到的那样。 这是非常“正常的”,取决于你的服务器configuration以及如何pipe理SSL证书。 例如。 如果您的SSL证书由前端代理(如CloudFlare)pipe理,那么HTTPS服务器variables可能未设置。 这似乎与你所看到的结果是一致的。

debugging

以下提示仅用于帮助初始debugging,以便find最终的解决scheme。

注意:在testing的同时,最好使用临时(302)redirect,而不是浏览器caching。 301(永久)redirect由浏览器caching,所以你必须确保caching被禁用,这使testing有问题。 请继续之前确保清除caching。

  1. 尝试(暂时)将其更改为HTTP到HTTPS(仅)redirect,即。 删除www的canonicalisation。 你还得到一个redirect循环? 例如:

     RewriteCond %{HTTPS} off RewriteRule ^ https://www.example.com%{REQUEST_URI} [R,L] 

    另:无需在RewriteRule replace中转义点 – 这是一个普通的string,而不是正则expression式。)

  2. 如果以上触发redirect循环,则检查服务器variablesHTTPS包含的内容。 即。 删除上面的HTTP到HTTPSredirect,并添加以下内容:

     RewriteRule ^foo$ /?HTTPS=%{HTTPS} [R,L] 

    并直接访问URL https://example.com/foo 。 您应该redirect到https://example.com/?HTTPS=<value> 。 什么是<value> ? ( <value>可能是空的。)

  3. 检查您的应用程序正在看到的HTTP请求标头。 如果使用PHP,请检查$_SERVER$_ENV超全局数组,并特别检查索引HTTPSSERVER_PORTSCRIPT_URIHTTP_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