【问题标题】:mod_rewrite match QUERY_STRINGmod_rewrite 匹配 QUERY_STRING
【发布时间】:2017-05-16 00:26:23
【问题描述】:

所以我正在尝试编写一个规则,如果某些字符串被传递给任何 php 脚本,它将以 404 响应。这是我想出的:

RewriteBase /

RewriteCond %{QUERY_STRING} ^.*(string1|string2).*$ [NC]
RewriteRule ^$ [R=404,L]

该规则似乎只匹配 www.domain.com/?string1 或 www.domain.com/?String2,但不匹配 www.domain.com/whatever.php?var=string1 或 www.domain.com/ directory/script.php?var=string1 或 www.domain.com/directory/1/script.php?var=string1 等等。

谁能帮忙指出我做错了什么?

最好的,

-尤利安

【问题讨论】:

  • 我还想补充一点,我已经尝试过 ^(.*)(string1|string2)(.*)$ 和 (string1|string2) 并且行为与上述相同。跨度>

标签: regex apache .htaccess mod-rewrite


【解决方案1】:

您的 RewriteRule 需要一个空路径。试试这样:

RewriteBase /

RewriteCond %{QUERY_STRING} ^.*(string1|string2).*$ [NC]
RewriteRule ^.*$ - [NC,L]

【讨论】:

    【解决方案2】:

    正如 Kevin 所说,您需要在查询字符串之前使用空 URL,即 ^$。你不需要所有的.*,你不必匹配完整的字符串。这会起作用,你也不需要RewriteBase

    RewriteCond %{QUERY_STRING} (?:string1|string2) [NC]
    RewriteRule ^ - [R=404,L]
    

    ?: 只是说不要捕获这个,它只是为了分组。 ^ 是一种匹配任何东西的方式。 - 表示不要更改 URL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 2016-11-12
      • 1970-01-01
      相关资源
      最近更新 更多