- 最后,如果以上匹配重定向
/shop/?s=或/shop?s=到root并提供503错误文档。
您不能“重定向到根目录”和“提供 503 错误文档”。重定向是 3xx 响应。您可以在内部重写对根的请求并通过定义ErrorDocument 503 / 发送503 HTTP 响应状态。但是,这反而违背了 503 的观点,并且无助于“CPU 使用率”。正如您已经定义的那样,只为 503 响应提供静态字符串似乎是最好的选择。
RewriteRule ^shop$ ./$1 [R=503,L]
当您设置 3xx 范围以外的代码时,替换 字符串(即./$1)将被完全忽略。您应该简单地在 substitution 字符串中包含一个连字符 (-) 以明确表示“无替换”。 L 标志在这里也是多余的。当指定一个非 3xx 返回码时,L 标志是隐含的。
这不是 robots.txt 网址(此时我想我应该删除它,甚至不需要)
同意,这项检查完全是多余的。您已经在检查请求是否为/shop,因此它也不可能是/robots.txt。 (对/robots.txt 的任何请求也不包含查询字符串。)
RewriteCond %{QUERY_STRING} !(^|&)s=*
由于某种原因,您已经否定(! 前缀)条件(也许是为了使其工作?) - 但您需要这是 @987654334 的 正 匹配@URL 参数。请注意,正则表达式 (^|&)s=* 不正确。尾随 * 匹配前面的模式 0 次或更多次。所以这个正则表达式只会匹配 s 或 s= 或 s== 并且对于 s=foo 会失败。
要将s URL 参数与“其中的任何内容”(包括nothing)匹配,您只需删除结尾的*,例如。 (^|&)s=。要将 s URL 参数与 something 作为值匹配,然后匹配单个字符,& 除外。例如。 (^|&)s=[^&].
- 用户代理包含“机器人” - 这部分工作正常,我测试过
“bots”还是“bot”,如上句所述?我无法想象“bots”会匹配很多bots,但“bot”会匹配很多!
RewriteCond %{HTTP_USER_AGENT} ^.*(bots).*$ [NC]
这个正则表达式的作用相当复杂。它还不必要地捕获了“机器人”一词(以后不再使用)。正则表达式 ^.*(bots).*$ 与简单的 bots 相同(没有捕获组)。
综合以上几点,我们有:
ErrorDocument 503 "Site temporarily disabled for crawling"
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} bots [NC]
RewriteCond %{QUERY_STRING} (?:^|&)s=
RewriteRule ^shop/?$ - [R=503]
上述规则做了以下事情:
- 匹配 URL 路径
shop 或 shop/
- 用户代理字符串包含单词“bots”
- 并且 URL 参数
s= 存在(任何地方)
- 如果以上都匹配,则提供 503(静态字符串)。
但是,我会询问 503 是否真的是正确的响应。通常,您根本不希望机器人抓取内部搜索结果;曾经。它可能是一个无底洞并浪费爬行预算。这应该是 403 吗?
而且,您是否已经在 robots.txt 中屏蔽了这些 URL? (这还不足以阻止“坏”机器人?)如果没有,我会考虑添加以下内容:
User-agent: *
Disallow: /shop?s=
Disallow: /shop/?s=
Disallow: /shop?*&s= # If the "s" param can occur anywhere
Disallow: /shop/?*&s= # (As above)