首页 > 解决方案 > 匹配查询的 Apache 重写条件

问题描述

当查询包含不在我的“白名单”字符类中的字符时,我需要一个重写条件来返回例如 403。查询以 q= 开头,所以我的尝试是:

RewriteCond %{REQUEST_URI} ^/generic/
RewriteCond %{REQUEST_METHOD} ^GET$
RewriteCond %{QUERY_STRING} q=[^a-z]+
RewriteRule .* - [F]

它几乎可以工作。唯一的问题是,当查询以“a”开头时,任何后面的黑名单字符都不会触发规则

例子:

q=abc -> rule does not match -> fine
q=Abc -> rule matches -> fine
q=abC -> rule does not match -> not fine

因此,当禁止字符不是“q=”之后的第一个字符时,该规则不起作用。

我错过了什么?有人能帮我吗?

BR

标签: apache.htaccessmod-rewriteurl-rewriting

解决方案


通过您显示的尝试,请尝试遵循 htaccess 规则文件。这里有 2 个要点,第 1 点你可以^.*最后的禁止规则中使用。第二个是你需要用NC覆盖小写来匹配正则表达式中的大小写字母。

RewriteCond %{REQUEST_URI} ^/generic/  [NC]
RewriteCond %{REQUEST_METHOD} ^GET$ [NC]
RewriteCond %{QUERY_STRING} q=[^a-z]+ [NC]
RewriteRule ^ - [F]

或者使用以下规则来匹配精确的查询字符串使用^$锚点来匹配精确的查询字符串值:

RewriteCond %{REQUEST_URI} ^/generic/  [NC]
RewriteCond %{REQUEST_METHOD} ^GET$ [NC]
RewriteCond %{QUERY_STRING}  ^q=[^a-z]+$ [NC]
RewriteRule ^ - [F]

推荐阅读