如何结合两个 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

如何从 Apache .htaccess 创建虚拟主机?

利用浏览器缓存,如何使用 apache 或 .htaccess?

当 HTTP 方法是 Apache .htaccess 上的 OPTIONS 时,如何避免请求基本身份验证?

如何使用 Apache VirtualHost 获取 .htaccess 文件