我试图保护主页面,因为在谷歌控制台上,我的报告在一个查询字符串是可见的,就像这个例子:
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
1条答案
按热度按时间xwbd5t1u1#
你离解决方案不远了:
说明
index.php
),那么你必须编写一个正则表达式,如^(?:index\.php)?$
:^
匹配字符串的开头,意味着 “它应该以”“开头,而不是仅仅 “它应该包含”“。$
匹配字符串的结尾,意思是 “它应该以” 结束。(?:)
是一个非捕获组。如果你输入()
,那么它就是一个捕获组,它将生成一个名为$1
的变量。但我们不需要捕获这部分内容并将其放回新重写的URL中,因为我们可以将-
放入 “nothing to change” 并生成404错误。将问号放在这个组后面意味着它可以存在或不存在。我把index\.php
放在里面,说明我们可以在URL中拥有它或不拥有它。必须转义点,因为.
在正则表达式模式中表示 “任何字符”。你可能会看到有人也写
^/?(?:index\.php)?$
,说明它可以带或不带前导斜杠。但通常 Apache 在 RewriteRule 测试中使用它之前总是会去掉这个前导斜杠。所以没有理由把它作为这个测试将使用几个CPU周期没有。**RewriteCond*只有在我们输入 RewriteRule 时才会运行。在这里,我们要测试查询字符串是否为空。这可以很容易地通过将任何字符与
.+
匹配一次或多次来完成。它将工作或没有^
和$
左右。我更喜欢使用它们来表明完整的查询字符串不能为空。