提问人:Dhon Collera 提问时间:10/2/2023 更新时间:10/2/2023 访问量:68
HTCacess重写条件404 所有查询字符串仅在索引页上
htaccess rewrite condition 404 all querystring only on index page
问:
我试图保护主页,因为在 Google 控制台上,我对 QueryString 的报告是可见的,如下例所示:
https://example.com/?s=something.g
我只想在主页“example.com/”上使用 404 所有查询字符串,但任何其他查询字符串,如 javascript/css 文件、文件夹和 wp-admin 都可以使用查询字符串
这是不允许的(仅在主页上):
https://example.com/?anything=something
https://example.com/?anythingnew=something&anotherone=something
https://example.com/index.php?anything=something
但是这些 URL 应该被允许(所有其他 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]
同样的事情,没有任何效果,规则应该只在主页上。提前致谢
答:
2赞
Patrick Janser
10/2/2023
#1
你离解决方案不远了:
RewriteCond %{QUERY_STRING} ^.+$
RewriteRule ^(?:index\.php)?$ - [R=404,L]
解释
RewriteRule 将采用路径(不带查询字符串) 作为输入。因此,如果您只想将此规则应用于主页 (有或没有)那么你必须写一个常规的 表达式如:
index.php
^(?:index\.php)?$
^
匹配字符串的开头,表示“它应该 从“开始”,而不仅仅是“它应该包含”。$
匹配字符串的末尾,表示“它应以”结尾”。(?:)
是非捕获组。如果你把,那么它就是一个 捕获组,这将生成一个名为 . 但是我们不需要捕获这部分来将其放回新的 重写的 URL,因为我们可以说“没有什么可更改的”并生成 404 错误。把问号放在这背后 group 意味着它可以存在或不存在。我已经把它放在里面,说我们可以在URL中拥有或不拥有它。圆点 必须转义,因为在常规中表示“任何字符” 表达模式。()
$1
-
index\.php
.
你可能会看到有人写信说 它可以带或不带前导斜杠。但通常情况下,Apache 在使用它之前总是会去掉这个前导斜杠 RewriteRule 测试。所以没有理由把它作为这个测试 将白白使用几个 CPU 周期。
^/?(?:index\.php)?$
只有当我们输入 RewriteRule 时,RewriteCond 才会运行。 在这里,我们要测试查询字符串是否为空。这可以 通过将任何 char 与 匹配一次或多次来轻松完成。 无论有没有和周围,它都可以工作。我更喜欢 放置它们以显示完整的查询字符串不能为空。
.+
^
$
评论