我正在重新从堆栈溢出我的问题,因为这实际上是更合适的地方来问这个问题。 原来的问题在下面。
这是我正在使用的重写规则:
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]
区别:
通常情况下,最好通过检查%{HTTPS}
variables而不是检查端口号来检查HTTPS是否开启 – 您可以轻松地将HTTPS绑定到另一个端口,这将违反规则(您将不得不编辑它)。 但这取决于你的具体情况..所以这取决于你。
更好的做“301永久redirect”( R=301
),而不是“302find”( R
) – 尤其是如果search引擎优化涉及这些url。 但是再一次 – 总的来说这不是一件大事。
你在主机匹配的模式中,我认为这只是一个错字。
如果你不希望你的域名被硬编码,你可以尝试这个规则 – 但我不能保证你的域名能正常工作:
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议略有不同,但稍微容易阅读(在我看来)。