用于在HTTP标头中搜索特定Referer的正则表达式

时间:2019-03-05 11:34:39

标签: regex

我需要创建一个正则表达式以匹配除给定Referer的特定URL外的所有内容。我目前可以匹配它,但不能将其反转并为其创建负片。

我目前拥有的东西:

Referer:(http(s)?(:\/\/))?(www\.)?test.com(\/.*)?

在下面的列表中:

Referer:http://www.test.online/
Referer:https://www.test.online/
Referer:https://www.test.tv/
Referer:https://www.blah.com/
Referer:https://www.test.com/
Referer:http://www.test.com/
Referer:http://test.com/
Referer:https://test.com/

它将匹配:

Referer:https://www.test.com/
Referer:http://www.test.com/
Referer:http://test.com/
Referer:https://test.com/

但是,我希望它可以匹配除这些以外的所有内容。

这是给我们的WAF使用的,因此很遗憾,它的用法受到限制,只能通过搜索传回的HTTP标头来实现。

2 个答案:

答案 0 :(得分:1)

尝试此正则表达式:

^(?!.*Referer:(http(s)?(:\/\/))?(www\.)?test.com(\/.*)?).*$

否定正则表达式的一种好方法是使用负前瞻。

说明:

否定的超前构造是一对圆括号,圆括号开头是一个问号和一个感叹号。在内部[任何正则表达式模式]。

工作示例:https://regex101.com/r/QJfeBB/1

答案 1 :(得分:0)

您可以使用锚点^来声明字符串的开头,并使用否定的前行来声明右边的内容与您要匹配的内容不符。

请注意,您必须对点进行转义以使其在字面上匹配,并且可以省略最后一部分(\/.*)?

如果您不使用捕获组以后再使用,也可以将它们变成非捕获组(?:)

^(?!Referer:(https?(:\/\/))?(www\.)?test\.com).+$

regex101 demo

关于图案

  • ^字符串的开头
  • (?!负向超前断言右边的内容不匹配
    • Referer:(https?(:\/\/))?(www\.)?test\.com匹配您的模式
  • )近距离否定预测
  • .+匹配除换行符1次以上以外的所有字符
  • $声明字符串的结尾