【问题标题】:Exact match with RewriteRule without regex与没有正则表达式的 RewriteRule 完全匹配
【发布时间】:2014-06-29 13:41:34
【问题描述】:

我有以下 htacces 来重写一个精确的 URL(views/index.php 到 views/index.xml):

RewriteEngine On
RewriteRule ^/views/index\.php$ /views/index.xml [L]

忘记\ 并输入^/views/index.php$ 太容易了,允许/views/indexXphp/views/index/php 而不仅仅是/views/index.php.

在我的情况下,使用完全匹配而不是正则表达式很好,所以这是一种告诉 Apache 对于下面的所有 RewriteRules / 对于这个 RewriteRule,点表示 .不是任何字符,所以点不会被转义

那么,有没有办法让 /views/index.php 完全匹配而无需转义点?

【问题讨论】:

  • 为什么会有?在正则表达式中,. 匹配任何字符(换行符除外,在某些情况下)。如果要匹配.,只需使用\.。搜索和寻找解决方法可能是浪费时间。即使一种方式,我还是建议你坚持传统的逃生路线,这样以后就不会有任何问题了。
  • 精确匹配方便。但是,如果重要的话,使用 RewriteCondRewriteRule 实现 1 个重定向的速度是使用单个 RewriteRule 的两倍。

标签: regex apache .htaccess mod-rewrite


【解决方案1】:

正如 Amal 在您的问题下方评论的那样,正则表达式中的点表示 任何字符,并且由于 RewriteRule 使用 URI 模式的正则表达式,因此您需要转义点以使其与文字点匹配。

但是在mod_rewrite 规则中,您可以使用RewriteCond 使其匹配文字字符串没有正则表达式,在匹配模式之前使用= 符号:

以下是您的翻译规则示例:

RewriteCond %{REQUEST_URI} =/views/index.php
RewriteRule ^ /views/index.xml [L]

【讨论】:

  • 对文字使用= 对编码字符有何影响?
【解决方案2】:

是的,您可以匹配 /views/index.php 而不转义点。

例如,您可以使用/views/index[.]php,其中的点位于字符类中。

此外,许多正则表达式标记允许您匹配点,而无需特别要求句点。例如,

  • . 将匹配句点
  • [[:punct:]] 将匹配句点
  • \D(不是数字)将匹配句点
  • \S(不是空格字符)将匹配句点
  • (?![-/])[--/]匹配一个句点(这是一个基于小范围 ASCII table 的特别不正当的正则表达式)

【讨论】:

  • 我认为 OP 希望指示 Apache 将某些特定 RewriteRules 中的所有 .s 视为文字 .
  • @AmalMurali 你可能是对的,但我什么时候才有机会使用(?![-/])[--/]?真正的美人,想看看这个世界。 :) 我必须关闭,太累了,但我敢肯定,当我起床时,其他人会准确地给 OP 他想要的东西。下次再见,Amal,感谢您的指导。
【解决方案3】:

与公认的答案不同,以下解决方案对我有用:

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/(source)$
RewriteRule ^(.*)$ destination [R=301,L]

信用:https://community.webfaction.com/questions/12887/apache-rewrite-to-match-an-exact-string

【讨论】:

    猜你喜欢
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    相关资源
    最近更新 更多