【问题标题】:How to hide a page url from bots/spiders?如何从机器人/蜘蛛中隐藏页面 url?
【发布时间】:2011-07-22 20:38:43
【问题描述】:

在我的网站上,我有 1000 种产品,它们都有自己的网页,可以通过 product.php?id=PRODUCT_ID 之类的内容访问。

在所有这些页面上,我都有一个链接,其中有一个 url action.php?id=PRODUCT_ID&referer=CURRNT_PAGE_URL .. 所以如果我访问 product.php?id=100 这个 url 变成 action.php?prod_id=100&referer=/product.php?id=1000 点击这个 url 将用户返回到 @ 987654323@

现在,我面临的问题是我不断收到蜘蛛的误击。有什么办法可以避免这些误击?我知道我可以在 robots.txt 中“拒绝”这个 url,但仍然有机器人忽略这个。你会推荐什么? 欢迎任何想法。谢谢

【问题讨论】:

  • 你提到的“误击”是什么?
  • 实际上,当访问 actions.php 时,它会在数据库中添加一个不属于任何用户的条目(根据应用程序的某些逻辑).. 如果是人类用户,则为 true,否则为 false。
  • 忽略 robots.txt 的机器人是混蛋。

标签: php


【解决方案1】:

另一种选择是使用 PHP 来检测访问您页面的机器人。

你可以使用这个 PHP 函数来检测机器人(这会得到大部分):

function bot_detected() {
  return (
    isset($_SERVER['HTTP_USER_AGENT'])
    && preg_match('/bot|crawl|slurp|spider|mediapartners/i', $_SERVER['HTTP_USER_AGENT'])
  );
}

只有当你发现用户不是机器人时才回显href链接到页面:

if (bot_detected()===false)) {
echo "http://example.com/yourpage";
}

【讨论】:

    【解决方案2】:

    目前,让 99% 的机器人(即使是那些选择忽略 robots.txt 的机器人)无法访问链接的最简单方法是使用 Javascript。添加一些不显眼的 jQuery:

    <script type="text/javascript">
    $(document).ready(function() {
        $('a[data-href]').attr('href', $(this).attr('data-href'));
      });
    });
    </script>
    

    按以下方式构建您的链接。

    <a href="" rel="nofollow" data-href="action.php?id=PRODUCT_ID&referrer=REFERRER">Click me!</a>
    

    因为 href 属性是在 DOM 准备好之后才写入的,所以 robots 不会找到任何可追踪的东西。

    【讨论】:

    • 此解决方案需要 javascript 才能使网站正常工作,引入无效标记,并且会非常非常严重损害您的 SEO。 (谷歌也需要这些网址)
    • @Dae .. 我认为这是留给我的唯一选择.. @Jacco 我理解.. 但由于我已经在 robots.txt 中禁止操作.php 我不认为它会伤害 SEO 等。虽然我同意无效标记问题,但我认为我可以摆脱它!
    • @Jacco 是valid HTML5。我不知道你为什么认为它会伤害 SEO,从谷歌当然不需要这些 URL 的问题来看。网站运行不需要 Javascript,但此链接需要使用 Javascript。
    • 搜索引擎使用href="/somewhere.html" 建立排名并在互联网上发现新页面。在您的示例中,href="" 是空的,因此缺少指向所有不同产品页面的所有重要链接。它将阻止(大多数)机器人(包括谷歌)跟踪隐藏的 URL。每个页面/产品都应该有一个唯一的 URL;建议的解决方案是错误的设计决策的错误解决方案。
    • 我对这个问题的合理假设是指向 product.php 的链接处理显示内容,而指向 action.php 的链接作用于内容。通常的做法是限制后一种类型的爬虫访问页面。也就是说,在每个未经身份验证的页面视图上创建数据库行的任何页面都是等待发生的拒绝服务 - 在 $_COOKIE 中跟踪这种无关紧要的信息是一个更好的主意。
    【解决方案3】:

    您的问题由 2 个不同的问题组成:

    1. 多个 URL 指向同一个资源
    2. 爬虫不尊重 robots.txt

    第二个问题很难解决,阅读Detecting 'stealth' web-crawlers

    第一个更容易。 您似乎需要一个选项来让用户返回上一页。

    我不确定你为什么不让浏览器的历史记录处理这个问题(通过使用后退按钮和 javascript 的 history.back();),但那里有足够的正当理由。

    为什么不使用引用标头?
    几乎所有常见的浏览器都会在每个请求中发送有关引用页面的信息。它可以被欺骗,但对于大多数游客来说,这应该是一个可行的解决方案。

    为什么不使用 cookie?
    如果您将CURRNT_PAGE_URL 存储在 cookie 中,您仍然可以为每个页面使用单个唯一的 URL,并且仍然可以根据 cookie 中设置的引用者动态创建面包屑和反向链接,并且不依赖于 HTTP-referrer 值.

    【讨论】:

    • 其实actions.php存储的是用户对产品的兴趣。因此,如果我不是登录用户,我可以对某些产品感兴趣,然后如果我登录或注册,这些兴趣将被添加到我的用户个人资料中以执行某些操作。如果只有人类访问此页面并且在表现出兴趣后不登录,我就不会得到大型数据库表。但是由于蜘蛛每天都在访问并且多次访问,我不断得到我想要避免的大型数据库表。
    • @Kay,看来您应该使用 cookie 选项。也许一周左右后清空桌子。
    • Cookie 创意不错。是的,我刚刚设置了一个 cron 作业来清空表.. 仅在上周就有超过 50,000 个蜘蛛条目!!!
    【解决方案4】:

    我不相信您可以阻止不听从您建议的用户代理。

    在走这条路之前,我真的很想确定机器人/蜘蛛是一个问题 - 做任何妨碍您网站自然导航的事情都应该被视为最后的手段。

    如果您真的想阻止蜘蛛,您可能需要考虑在链接中使用 javascript,以便仅在单击链接后进行导航。这应该会阻止蜘蛛。

    就我个人而言,我对蜘蛛或机器人并不在意。

    【讨论】:

      【解决方案5】:

      您可以使用 robots.txt 文件来阻止符合要求的机器人。

      配置 robots.txt 后,接下来您可以检查您的服务器日志。找出任何可疑的用户代理。

      假设你找到 evil_webspider_crawling_everywhere 作为用户代理,你可以在请求的 headers 中检查它(对不起,没有例子,很久没有使用 php)并拒绝访问 webspider。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-02
        • 1970-01-01
        • 1970-01-01
        • 2013-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多