htaccess 重写条件 404 所有查询字符串仅在索引页上

问题描述 投票:0回答:1

我试图保护主页,因为在谷歌控制台上我关于查询字符串的报告是可见的,如下例所示:

https://example.com/?s=something.g

我想仅在主页“example.com/”上对所有查询字符串进行 404 处理,但任何其他页面(例如 javascripts/css 文件、文件夹和 wp-admin)都可以使用查询字符串

这是不允许的(仅在主页上):

https://example.com/?anything=something
https://example.com/?anythingnew=something&anotherone=something
https://example.com/index.php?anything=something

但是应该允许这些网址(所有其他网址都应该是好的):

https://example.com/something.js?anything=something
https://example.com/folder/?anything=something
https://example.com/folder/anotherfolder/anyfile.php?anything=something

我正在尝试这样做:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^?]*)\?
RewriteRule (.*) /$1? [R=404,L]

似乎所有查询字符串都被禁止,包括其中的文件和文件夹。

我也尝试过这个:

RewriteCond %{QUERY_STRING} .+
RewriteRule (.*) /$1? [R=404,L]

同样的事情,没有任何作用,规则应该只在主页上。预先感谢

regex apache .htaccess mod-rewrite query-string
1个回答
0
投票

你离解决方案不远了:

RewriteCond %{QUERY_STRING} ^.+$
RewriteRule ^(?:index\.php)?$ - [R=404,L]

解释了

  1. RewriteRule将采用路径(不带查询字符串) 作为输入。因此,如果您只想将此规则应用于主页 (有或没有

    index.php
    )那么你必须写一个常规的 诸如
    ^(?:index\.php)?$
     :

    之类的表达
    • ^
      匹配字符串的开头,意思是 “它应该 以“”开头,而不仅仅是“”,它应该包含“”。
    • $
      匹配字符串结尾,意思是 “应该以”结束。
    • (?:)
       是非捕获群。如果你输入 
      ()
       那么它就是
      捕获组,这将生成一个名为 
      $1
       的变量。
      但我们不需要捕获这部分并将其放回新的
      重写 URL,因为我们可以直接用 
      -
       来表示 
      “无需更改” 并生成 404 错误。把问号放在这后面 group 表示它可以存在或不存在。我已经放了index\.php
      在其中表示我们可以在 URL 中包含它或不包含它。点
      必须转义,因为 
      .
       在常规中表示 
      “任何字符” 表达模式。
    您可能会看到有人也写

    ^/?(?:index\.php)?$

    来这么说
    它可以有或没有前导斜杠。但正常情况下
    
    Apache 在使用它之前总是会去掉这个前导斜杠 RewriteRule 测试。所以没有理由把它作为这个测试 将毫无意义地使用几个 CPU 周期。

  2. 仅当我们输入

    RewriteRule时,RewriteCond才会运行。 在这里,我们要测试查询字符串是否为空。这个可以 通过将任何字符与 .+

     匹配一次或多次即可轻松完成。
    无论有或没有 
    ^
    $
     ,它都可以工作。我更喜欢
    让它们显示完整的查询字符串不能为空。

© www.soinside.com 2019 - 2024. All rights reserved.