【问题标题】:How to combine two Apache htaccess redirect conditions (http to https and non-www to www)如何结合两个 Apache htaccess 重定向条件(http 到 https 和非 www 到 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]

同时满足两个条件时的多次重定向结果输出如下:

【问题讨论】:

    标签: regex apache .htaccess mod-rewrite redirect


    【解决方案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} 在原始问题中的重定向字符串。
      猜你喜欢
      • 1970-01-01
      • 2013-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      • 1970-01-01
      • 2014-12-13
      • 2017-02-02
      相关资源
      最近更新 更多