【问题标题】:Rewrite shop search page using htaccess使用 htaccess 重写商店搜索页面
【发布时间】:2021-12-12 02:50:12
【问题描述】:

我试图阻止某些用户代理访问搜索页面,主要是机器人和爬虫,因为它们最终会增加 CPU 使用率。

当然使用 htaccess 重写引擎。我目前有这个(一直在尝试我在 SO 和其他地方找到的许多不同的规则组合)

# Block user agents
ErrorDocument 503 "Site temporarily disabled for crawling"
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^.*(bots).*$ [NC]
# RewriteCond %{QUERY_STRING} ^s=(.*)$
# RewriteCond /shop(?:\.php)?\?s=([^\s&]+)
RewriteCond %{QUERY_STRING} !(^|&)s=*
RewriteCond %{REQUEST_URI} !^/robots.txt$
# RewriteRule ^shop*$ /? [R=503,L] 
RewriteRule ^shop$ ./$1 [R=503,L] 

很抱歉,许多注释掉的行 - 正如我所提到的,我一直在尝试很多不同的东西,但似乎 htaccess 重写规则不是我的一杯茶。

我想做的是,如果用户代理包含“bot”,则返回 503 错误。条件是

  1. 用户代理包含“机器人” - 这部分工作正常,我测试过
  2. 如果有 s 查询字符串,其中包含任何内容。
  3. 这不是 robots.txt 网址(此时我认为我应该删除它,甚至不需要)
  4. 最后,如果以上匹配重定向/shop/?s=/shop?s=到root并提供503错误文档。

【问题讨论】:

    标签: apache .htaccess mod-rewrite


    【解决方案1】:
    1. 最后,如果以上匹配重定向/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 次或更多次。所以这个正则表达式只会匹配 ss=s== 并且对于 s=foo 会失败。

    要将s URL 参数与“其中的任何内容”(包括nothing)匹配,您只需删除结尾的*,例如。 (^|&)s=。要将 s URL 参数与 something 作为值匹配,然后匹配单个字符,& 除外。例如。 (^|&)s=[^&].

    1. 用户代理包含“机器人” - 这部分工作正常,我测试过

    “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]
    

    上述规则做了以下事情:

    1. 匹配 URL 路径 shopshop/
    2. 用户代理字符串包含单词“bots”
    3. 并且 URL 参数 s= 存在(任何地方)
    4. 如果以上都匹配,则提供 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)
    

    【讨论】:

      【解决方案2】:

      由于您明确定义了决定标准,因此可以直接实施。我理解您的问题,因此所有这些标准都必须得到满足......

      RewriteEngine On
      RewriteCond %{ENV:REDIRECT_STATUS} !=503
      RewriteCond %{HTTP_USER_AGENT} bots [NC]
      RewriteCond %{QUERY_STRING} (?:^|&)s=[^&]+(?:&|$)
      RewriteCond %{REQUEST_URI} !^/robots\.txt$
      RewriteRule ^/?search/?$ - [R=503,L]
      

      不知道为什么你测试“bots”而不是“bot”(你的问题自相矛盾)。

      【讨论】:

      • 嗨,谢谢。我收到的答案比我预期的要多,其中一些仍然存在,但我相信它会起作用。至于您的问题为什么是“机器人”,实际上我只是举个例子,实际上我可能需要检查一些字符串,例如 bot|bots|Yandex 等。
      【解决方案3】:

      使用您显示的示例/尝试,请尝试遵循 htaccess 规则文件。

      请确保在测试您的 URL 之前清除您的浏览器缓存。

      # Block user agents
      ErrorDocument 503 "Site temporarily disabled for crawling"
      RewriteEngine On
      ##1st condition here(User agent contains "bots")....
      RewriteCond %{HTTP_USER_AGENT} ^.*(bots).*$ [NC]
      RewriteRule ^ - [R=503,L]
      
      ##2nd condition here(If there is a s query string, with anything in it)...
      RewriteCond %{THE_REQUEST} !\s.*robot\.txt\s [NC]
      RewriteRule ^ - [R=503,L]
      
      ##3rd condition here(query string contains s in it)...
      RewriteCond %{THE_REQUEST} \s.*\?(.*s.*)\s [NC]
      RewriteRule ^ - [R=503,L]
      
      ##4th condition here(match /shop/?s= or /shop?s= and get 503 in those requests)...
      RewriteCond %{THE_REQUEST} \shop/?\?s=.*s [NC]
      RewriteRule ^ - [R=503,L]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多