我正在重建来自 Stack Overflow 的我的疑问因为这实际上是提出这个问题更合适的地方。原始问题如下。
以下是我正在使用的重写规则:
RewriteCond %{SERVER_PORT} ^443$
RewriteCond %{HTTP_HOST} !^(www.)secure.\ [NC]
RewriteRule (.*) https://secure.%{HTTP_HOST}%{REQUEST_URI} [R,L]
如果端口为 443(SSL 端口)并且请求的域名不是以 secure 或 www.secure 开头,则应应用此规则。
相反,它会重定向到 secure.secure,然后返回 404 错误。或者,如果我从重写规则创建中删除 secure
RewriteCond %{SERVER_PORT} ^443$
RewriteCond %{HTTP_HOST} !^(www.)secure.\ [NC]
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
我收到太多重定向错误。
我承认,我不是 mod_rewrite 专家,但我认为自己能够参考文档。然而,我却对此束手无策。谢谢!
答案1
最好的方法是硬编码域名(我不知道你可能有什么域名,因此这是更好的选择)。试试这个规则:
RewriteCond %{HTTPS} =on
RewriteCond %{HTTP_HOST} !^(www\.)?secure\. [NC]
RewriteRule .* https://secure.example.com%{REQUEST_URI} [R=301,L]
差异:
一般来说,最好通过检查
%{HTTPS}
变量而不是检查端口号来检查 HTTPS 是否已启用——您可以轻松地将此站点的 HTTPS 绑定到另一个端口,这将违反规则(并且您必须对其进行编辑)。但这取决于您的具体情况……所以由您决定。最好使用“301 永久重定向”(
R=301
),而不是“302 找到”(R
)——尤其是当 SEO 涉及这些 URL 时。但再次强调——这通常不是什么大事。您的模式中有
.\
主机匹配 - 我认为这只是一个打字错误。
如果你不想让你的域名被硬编码,你可以尝试这条规则——但我不能保证它能 100% 正常工作:
RewriteCond %{HTTPS} =on
RewriteCond %{HTTP_HOST} !^(www\.)?secure\.(.+)$ [NC]
RewriteRule .* https://secure.%2%{REQUEST_URI} [R=301,L]
答案2
我避免使用硬编码域名,而是按照%{HOST_NAME}
我的建议RewriteRule
汤姆·奥康纳回答我的问题在 Apache 中强制使用 SSL,无需对主机名进行硬编码,如果这有帮助的话,但你的问题的关键部分似乎(在我看来)是%1
匹配(www.)?
你的RewriteCond
,而不是(.*)
你的RewriteRule
,这将是%2
,正如建议的那样懒人一 在他们的回答中。
就我个人而言,我认为我会使用以下内容:
RewriteCond %{HTTPS} =on
RewriteCond %{HTTP_HOST} !^(www.)?secure\.(.+)$ [NC]
RewriteRule ^(.*)$ https://secure.$2/$3 [R=301,L]
,这与 LazyOne 的建议只有一点点不同,但更容易阅读(在我看来)。