如何结合两个 Apache htaccess 重定向条件(http 到 https 和非 www 到 www)
Posted
技术标签:
【中文标题】如何结合两个 Apache htaccess 重定向条件(http 到 https 和非 www 到 www)【英文标题】:How to combine two Apache htaccess redirect conditions (http to https and non-www to www) 【发布时间】:2014-07-18 03:27:01 【问题描述】:我有两个独立工作的重定向条件,但我想避免同时满足两个条件的情况(这导致两个重定向步骤而不是一个)
我必须承认我不擅长 Apache 正则表达式,所以我把它们从网上弄下来了。知道如何将两者结合起来(A 或 B 有点逻辑与正则表达式)?
代码如下:
RewriteEngine On
# redirect from http to https
RewriteCond %HTTPS off
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI
# redirect from non-www to www https
RewriteCond %HTTP_HOST !^www\. [NC]
RewriteRule ^(.*)$ https://www.%HTTP_HOST%REQUEST_URI [R=301,L]
同时满足两个条件时的多次重定向结果输出如下:
【问题讨论】:
【参考方案1】:您可以使用OR
条件子句将这两个规则合二为一:
RewriteEngine On
RewriteCond %HTTPS off [OR]
RewriteCond %HTTP_HOST !^www\. [NC]
RewriteRule ^ https://www.domain.com%REQUEST_URI [R=301,L,NE]
只需将www.domain.com
替换为您的实际域名即可。此外,最好在新浏览器中对此进行测试,以避免 301 缓存问题。
【讨论】:
【参考方案2】:只需首先放置您的非 www 到 www 规则,因为它在重定向中指定了 https 端点。如果满足非www条件,则无论原始请求是http还是https,都会触发此规则。
RewriteEngine On
# redirect from non-www to www with https
RewriteCond %HTTP_HOST !^www\. [NC]
RewriteRule ^(.*)$ https://www.%HTTP_HOST%REQUEST_URI [R=301,L]
# redirect from http to https
RewriteCond %HTTPS off
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI
【讨论】:
感谢@Mike Brant,我尝试了您的解决方案,但结果相同。将检查来自 Apache 日志的请求顺序并确认是否有任何影响。再次感谢您的建议。 它可以工作,只是我的浏览器缓存仍然把它的数据全部扭曲了。我按照您的建议检查了访问日志中的请求顺序。但我会坚持使用 anubhava 的 解决方案,因为它完美地结合了两者。非常感谢。 @luhfluh 是的,该解决方案确实有效,但问题更大,如果您需要支持各种不同的域名,则需要进行一些调整,这似乎通过使用%HTTP_HOST
在原始问题中的重定向字符串。以上是关于如何结合两个 Apache htaccess 重定向条件(http 到 https 和非 www 到 www)的主要内容,如果未能解决你的问题,请参考以下文章
htaccess 从 Basic Auth 中排除一个 url
利用浏览器缓存,如何使用 apache 或 .htaccess?