【问题标题】:Is it possible to use a mod_rewrite server variable inside a RewriteCond's CondPattern?是否可以在 RewriteCond 的 CondPattern 中使用 mod_rewrite 服务器变量?
【发布时间】:2013-02-28 19:39:22
【问题描述】:

使用mod_rewrite,我想使用服务器变量作为CondPattern 的一部分RewriteCond,类似于:

RewriteCond %{HTTP_HOST} !^%{SERVER_NAME} [NC]
                           ^^^^^^^^^^^^^^

这将非常有用。我知道CondPattern 是与Perl 兼容的正则表达式,这意味着例如我的示例中的{} 字符需要以某种方式转义。我保持原样只是为了展示这个想法。

据我所知,上述文档没有提及任何关于它的内容,并且谷歌搜索我无法找到任何确定的内容。我的直觉是答案是,但我想确定一下。

【问题讨论】:

    标签: apache mod-rewrite


    【解决方案1】:

    CondPattern 不会扩展%{VAR} 变量或%N 对前面RewriteCond 的反向引用,所以大卫的建议

    RewriteCond %{SERVER_NAME} ^(.*)$
    RewriteCond %{HTTP_HOST} !%1
    

    只要%{HTTP_HOST} 不包含文字字符串%1,就会成功,这不是您想要的。

    你想要什么,根据你的例子

    RewriteCond %{HTTP_HOST} !^%{SERVER_NAME} [NC]
    

    匹配HTTP_HOST 不以SERVER_NAME 开头(不区分大小写)。如果您在TestString 中包含SERVER_NAME,则可以使用单个RewriteCond 来实现这一点,在正则表达式中捕获它,然后使用\N 再次引用它:

    RewriteCond "%{SERVER_NAME} %{HTTP_HOST}" "!(^[^ ]*) \1" [NC]
    

    正则表达式使用空格分隔SERVER_NAMEHTTP_HOST,因为两个变量都不能有空格。

    Apache 表达式(2.4 及更高版本)

    如果你真的只是想测试SERVER_NAME是否等于HTTP_HOST,使用Apache expressions会更简单:

    # Case-sensitive comparison.
    RewriteCond expr "%{HTTP_HOST} == %{SERVER_NAME}"
    

    # Case-insensitive comparison.
    RewriteCond expr "tolower(%{HTTP_HOST}) == tolower(%{SERVER_NAME})"
    

    【讨论】:

    • Apache 表达式功能从 Apache 2.4 开始可用,因此如果它不适合您,请检查您的 Apache 版本。 (文档链接指向 V2.4 页面,但该页面上的文档并未明确说明该功能适用​​于 2.4 及更高版本。)
    • 很好@benrifkah,我刚刚检查过,确实 Apache Expressions 是 2.4 的新功能。 New features in Apache 2.4 证实了这一点,它说 通用表达式解析器。刚刚编辑了帖子以反映这一点。
    【解决方案2】:

    不,你不能像那样直接使用变量,但你可以做的是这样的:

    RewriteCond %{SERVER_NAME} ^(.*)$
    RewriteCond %{HTTP_HOST} !%1
    

    第一行应始终匹配并捕获 SERVER_NAME。然后第二行使用捕获的值与 HTTP_HOST 进行比较。

    【讨论】:

    • 这不起作用。您不能在 CondPattern 中使用%1(反向引用),原因与“您不能直接使用变量”相同。 %1 不被评估,被视为文字字符串。
    猜你喜欢
    • 2011-01-03
    • 2014-10-18
    • 2021-03-16
    • 2023-03-21
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    相关资源
    最近更新 更多