我试图保护主页,因为在谷歌控制台上我关于查询字符串的报告是可见的,如下例所示:
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]
同样的事情,没有任何作用,规则应该只在主页上。预先感谢
你离解决方案不远了:
RewriteCond %{QUERY_STRING} ^.+$
RewriteRule ^(?:index\.php)?$ - [R=404,L]
RewriteRule将采用路径(不带查询字符串) 作为输入。因此,如果您只想将此规则应用于主页 (有或没有
index.php
)那么你必须写一个常规的
诸如 ^(?:index\.php)?$
: 之类的表达
^
匹配字符串的开头,意思是 “它应该
以“”开头,而不仅仅是“”,它应该包含“”。$
匹配字符串结尾,意思是
“应该以”结束。
(?:)
是非捕获群。如果你输入
()
那么它就是 捕获组,这将生成一个名为
$1
的变量。 但我们不需要捕获这部分并将其放回新的 重写 URL,因为我们可以直接用
-
来表示“无需更改” 并生成 404 错误。把问号放在这后面 group 表示它可以存在或不存在。我已经放了
index\.php
在其中表示我们可以在 URL 中包含它或不包含它。点 必须转义,因为
.
在常规中表示“任何字符” 表达模式。
^/?(?:index\.php)?$
来这么说 它可以有或没有前导斜杠。但正常情况下Apache 在使用它之前总是会去掉这个前导斜杠 RewriteRule 测试。所以没有理由把它作为这个测试 将毫无意义地使用几个 CPU 周期。
RewriteRule时,RewriteCond才会运行。
在这里,我们要测试查询字符串是否为空。这个可以
通过将任何字符与 .+
匹配一次或多次即可轻松完成。 无论有或没有
^
和
$
,它都可以工作。我更喜欢 让它们显示完整的查询字符串不能为空。