【问题标题】:Match HTTP_HOST within a RewriteRule instead of using RewriteCond在 RewriteRule 中匹配 HTTP_HOST 而不是使用 RewriteCond
【发布时间】:2010-11-26 08:33:58
【问题描述】:

我需要进行一堆 301 重定向,其中包含来自同一个 .htaccess 文件的不同域。我可以为每个规则编写一个 RewriteCond,如下所示,它工作正常:

RewriteCond %{HTTP_HOST} www.domain1.com [NC]
RewriteRule old-url-1a.htm /new-url-1a [L,R=301]

RewriteCond %{HTTP_HOST} www.domain1.com [NC]
RewriteRule old-url-1b.htm /new-url-1b [L,R=301]

RewriteCond %{HTTP_HOST} www.domain2.com [NC]
RewriteRule old-url-2a.htm /new-url-2a [L,R=301]

RewriteCond %{HTTP_HOST} www.domain2.com [NC]
RewriteRule old-url-2b.htm /new-url-2b [L,R=301]

但是使用这种方法,我需要为每个单独的 URL 编写 2 行代码,这会变得非常冗长和重复(相同的 RewriteCond 会重复很多次)。 有什么方法可以从 RewriteRule 指令本身匹配 HTTP_HOST 吗?沿着这些思路(概念上):

RewriteRule www.domain1.com/old-url-1a.htm /new-url-1a [L,R=301]
RewriteRule www.domain1.com/old-url-1b.htm /new-url-1b [L,R=301]

RewriteRule www.domain2.com/old-url-2a.htm /new-url-2a [L,R=301]
RewriteRule www.domain2.com/old-url-2b.htm /new-url-2b [L,R=301]

谢谢。

【问题讨论】:

    标签: .htaccess mod-rewrite


    【解决方案1】:

    Apache 文档中提到了 RewriteRule:

    匹配的是什么?

    模式最初将与主机名和端口之后、查询字符串之前的 URL 部分进行匹配。 如果您希望匹配主机名、端口或查询字符串,使用带有 %{HTTP_HOST}、%{SERVER_PORT} 或 %{QUERY_STRING} 变量的 RewriteCond分别。

    但是,如果您能够将规则放入您的 apache-config 中,还有另一种简写方式:您可以使用 RewriteMap。

    RewriteMap     host-redirects   txt:/etc/apache2/host-redirects.map
    RewriteRule ^/([^/]*).htm$ http://%{HTTP_HOST}/${host-redirects:%{HTTP_HOST}/$1|$1} [R,L]
    

    host-redirects.map 如下所示:

    www.domain1.com/old-url-1a.htm /new-url-1a/
    www.domain1.com/old-url-1b.htm /new-url-1b/
    www.domain2.com/old-url-2a.htm /new-url-2a/
    

    【讨论】:

    • 感谢您向我介绍这个!不幸的是,我的系统管理员不允许我更改 Apache 配置,所以我想我将不得不在我的 htaccess 中求助于一大堆规则......
    【解决方案2】:

    BTW 映射可能是调试“真正匹配的内容”的唯一方法

    您可以将 RewriteLogLevel 设置为 9,日志不会显示使用 RewriteCond 解析的内容。
    相反,它说“它是否匹配”。 不是很有用

    使用映射 (RewriteMap),日志清楚地说明传递了什么键。 示例:
    (/var/log/http/rewrite.log) map lookup OK: map=host-redirects[txt] key=WHAT_IS_PARSED -> WHAT_IS_RETURNED

    map lookup FAILED: map=host-redirects[txt] key=WHAT_IS_PARSED

    使用 RewriteRule,| 之后的正确术语指定默认返回值。
    在大多数情况下,一个默认的 404.html 页面或有点。 非常有用

    所以在你的 httpd.conf 中,设置
    RewriteLog logs/rewrite.log RewriteLofLevel 9
    在你的虚拟主机中,你就完成了:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      • 1970-01-01
      相关资源
      最近更新 更多