regex htaccess rewrite condition 404 all querystring only on index page

2ledvvac  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(68)

我试图保护主页面,因为在谷歌控制台上,我的报告在一个查询字符串是可见的,就像这个例子:

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

我想404所有的querystring只在主页上“example.com/“,但任何其他像javascript/css文件,文件夹和WP-管理员可以使用querystring
这是不允许的(仅在主页上):

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

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

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]

同样的事情,没有工作,规则应该只在主页上。thanks in advance

xwbd5t1u

xwbd5t1u1#

你离解决方案不远了:

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

说明

    • RewriteRule * 将路径(不带查询字符串)作为输入。因此,如果你只想将这个规则应用于主页(有或没有index.php),那么你必须编写一个正则表达式,如^(?:index\.php)?$
  • ^匹配字符串的开头,意味着 “它应该以”“开头,而不是仅仅 “它应该包含”“。
  • $匹配字符串的结尾,意思是 “它应该以” 结束。
  • (?:)是一个非捕获组。如果你输入(),那么它就是一个捕获组,它将生成一个名为$1的变量。但我们不需要捕获这部分内容并将其放回新重写的URL中,因为我们可以将-放入 “nothing to change” 并生成404错误。将问号放在这个组后面意味着它可以存在或不存在。我把index\.php放在里面,说明我们可以在URL中拥有它或不拥有它。必须转义点,因为.在正则表达式模式中表示 “任何字符”

你可能会看到有人也写^/?(?:index\.php)?$,说明它可以带或不带前导斜杠。但通常 ApacheRewriteRule 测试中使用它之前总是会去掉这个前导斜杠。所以没有理由把它作为这个测试将使用几个CPU周期没有。

**RewriteCond*只有在我们输入 RewriteRule 时才会运行。在这里,我们要测试查询字符串是否为空。这可以很容易地通过将任何字符与.+匹配一次或多次来完成。它将工作或没有^$左右。我更喜欢使用它们来表明完整的查询字符串不能为空。

相关问题