【问题标题】:Apache rewrite condition for matching Query匹配查询的 Apache 重写条件
【发布时间】:2023-04-02 03:05:01
【问题描述】:

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

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

它几乎可以工作了。唯一的问题是,当查询以例如开头时“一个”, 以下任何被列入黑名单的字符都不会触发规则

例子:

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

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

我错过了什么?有人可以帮我吗?

BR

【问题讨论】:

    标签: apache .htaccess mod-rewrite url-rewriting


    【解决方案1】:

    根据您显示的尝试,请尝试遵循 htaccess 规则文件。这里有 2 个重点,第一个你可以使用 ^,尽管在最后一个禁止规则中有 .*。第二是您需要使用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]
    

    【讨论】:

    • 嗨 RavinderSingh13,a-z 只是一个例子,所以不需要 [NC],但无论如何谢谢你 :-) 遗憾的是,你提出的上述正则表达式并没有改变行为。仍然没有匹配,例如“q=”之后的第二个字符在“a-z”之外,例如“一个”。仅在第一个字符超出模式时才根据需要工作。 BR
    • @gnocchi01,您能否提供一个您想要匹配的字符串示例?
    • 嗨@RavinderSingh13,感谢您的支持,我以相反的方式解决了它并阻止了一些字符,而不是将所有允许的字符列入白名单。基本上,我想允许所有 a-zA-Z0-)äöüÖÄÜßáàéè 等等。谢谢,这个问题解决了。用这个 rewritecond 解决: RewriteCond %{QUERY_STRING} (?:^|&)q=[^&]*[$/][^&]*
    猜你喜欢
    • 1970-01-01
    • 2012-12-25
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    相关资源
    最近更新 更多