为什么这会导致我的网站redirect到secure.secure。* root domain * .com?

我正在重新从堆栈溢出我的问题,因为这实际上是更合适的地方来问这个问题。 原来的问题在下面。


这是我正在使用的重写规则:

RewriteCond %{SERVER_PORT} ^443$ RewriteCond %{HTTP_HOST} !^(www.)secure.\ [NC] RewriteRule (.*) https://secure.%{HTTP_HOST}%{REQUEST_URI} [R,L] 

如果端口是443(SSL端口),并且请求的域不是以secure或www.secure开始,则应该应用此规则。

相反,它redirect到secure.secure,然后返回一个404错误。 另外,如果我删除安全从重写规则创build

 RewriteCond %{SERVER_PORT} ^443$ RewriteCond %{HTTP_HOST} !^(www.)secure.\ [NC] RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L] 

我得到了太多的redirect错误。

我承认,我不是一个mod_rewrite专家,但我认为自己能够参考文档的function。 不过在这个问题上,我很难过。 谢谢!

最好的办法是硬编码的域名(我不知道你可能有什么域名,所以这是最好的select)。 试试这个规则:

 RewriteCond %{HTTPS} =on RewriteCond %{HTTP_HOST} !^(www\.)?secure\. [NC] RewriteRule .* https://secure.example.com%{REQUEST_URI} [R=301,L] 

区别:

  1. 通常情况下,最好通过检查%{HTTPS}variables而不是检查端口号来检查HTTPS是否开启 – 您可以轻松地将HTTPS绑定到另一个端口,这将违反规则(您将不得不编辑它)。 但这取决于你的具体情况..所以这取决于你。

  2. 更好的做“301永久redirect”( R=301 ),而不是“302find”( R ) – 尤其是如果search引擎优化涉及这些url。 但是再一次 – 总的来说这不是一件大事。

  3. 你在主机匹配的模式中,我认为这只是一个错字。


如果你不希望你的域名被硬编码,你可以尝试这个规则 – 但我不能保证你的域名能正常工作:

 RewriteCond %{HTTPS} =on RewriteCond %{HTTP_HOST} !^(www\.)?secure\.(.+)$ [NC] RewriteRule .* https://secure.%2%{REQUEST_URI} [R=301,L] 

我避免在我的RewriteRule行中使用%{HOST_NAME}对域名进行硬编码,正如Tom O'Connor在回答我的问题时所build议的那样, 在Apache中强制SSL而不对主机名进行硬编码 (如果有帮助的话),但是关键部分问题似乎(对我)是%1匹配(www.)? 从您的RewriteCond ,而不是从您的RewriteRule ,这将是%2(.*) ,由LazyOne 在他们的答案build议。

我个人认为我会使用以下内容:

 RewriteCond %{HTTPS} =on RewriteCond %{HTTP_HOST} !^(www.)?secure\.(.+)$ [NC] RewriteRule ^(.*)$ https://secure.$2/$3 [R=301,L] 

,这与LazyOne的build议略有不同,但稍微容易阅读(在我看来)。