【问题标题】:Regex in mod_rewrite to match URLs NOT ending with this OR thatmod_rewrite 中的正则表达式以匹配不以 this OR 结尾的 URL
【发布时间】:2021-10-22 15:36:47
【问题描述】:

这个的正则表达式是什么?

如果是字符串则匹配

  • 不(以.php 结尾或以.html 结尾或包含/

谢谢!

编辑:我需要NOT 部分,因为该表达式将用于Apache mod 重写,因为我无法更改mod_rewrite 的逻辑以避免NOT

编辑:我最初的努力是([^/]+)(\.html)$(^\.php)$ - 这是非常错误的

【问题讨论】:

  • 到目前为止你付出了哪些努力?
  • ([^/]+)(\.html)$(^\.php)$ -- 大错特错
  • 把它放在问题里还是不错的,表明你已经努力了。
  • 拜托,一切都是美好的。使用格式化功能! :)

标签: regex mod-rewrite


【解决方案1】:

Apache mod_rewrite 是否支持否定,根据this document

在 mod_rewrite 中,NOT 字符 ('!') 也可以作为可能 模式前缀。这使您能够 否定一个模式;说,对于 实例:``如果当前 URL 是 不匹配此模式''。这可以是 用于特殊情况,其中它 更容易匹配负数 模式,或作为最后的默认规则。

所以您应该能够执行以下操作:

!^(.*?/.*|.*?\.(?:php|html)$)$

这应该匹配任何不包含 / 且不以 .php 或 .html 结尾的内容

【讨论】:

  • 太棒了!非常感谢。我不知道!特征。希望下次我会以更好的方式询问。
  • 现在可以将其添加为变量吗?我试过 RewriteRule !^(.*?/.*|.*?\.(?:php|html)$)$ headers.php?a=$1 [NC,L] 但它不会传递变量跨度>
  • 我猜因为你要进行否定匹配,所以组没有直接匹配的方法,因为你匹配的东西可能与组不匹配,所以我们需要一个非否定匹配这不包括你想要的。我不记得 mod_rewrite 是否支持负向回溯,但试试这个 RewriteRule ^([^/]*(?<!\.html$)(?<!\.php$))$ headers.php?a=$1 [NC,L] 看看它是否有效?
【解决方案2】:

在正则表达式中进行正匹配比负匹配要容易得多。尝试搜索ends in .php OR ends in .html OR contains / 并反转程序中的逻辑。

对于严格的正则表达式,没有通用的方法来否定给定的表达式。使用 PCRE,您可以获得负前瞻的优势,这会显着简化构建否定搜索的过程,但会牺牲性能。

^([^/]*\.(?!html$|php$)[^./]*)|[^/.]$

【讨论】:

  • 我不能,因为我需要它来实现 Apache 重写规则。 :(
  • 看起来 mod_rewrite 确实会否定 - 我已经为此添加了一个适当的答案 - 但我可能仍然会使用 Eclipse 刚刚添加的表达式。
【解决方案3】:

使用这个正则表达式 -

(.*\.php$)|(.*\.html$)|(.*\/.*)

【讨论】:

  • 感谢您的回答,但它错过了 NOT 部分。它匹配 "foo.php" "fo/o" 和 "foo.html" 。它应该匹配除此之外的所有内容。
猜你喜欢
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多