我检查了日志,发现搜索引擎在我的网站上访问了很多虚假URL。它们很可能是在许多链接被更改之前,即使我已经进行了301重定向,但某些链接已经以非常奇怪的方式被更改,并且我的.htaccess文件无法识别。
所有请求都由index.php处理。如果由于URL错误而无法创建响应,则会显示自定义错误页面。使用简化代码index.php看起来像这样
try {
$Request = new Request();
$Request->respond();
} catch(NoresponseException $e) {
$Request->presentErrorPage();
}
我刚刚意识到这个页面会返回一个状态200,告诉机器人该页面有效,即使它不是。
是否足以在catch语句中添加404标头以告诉机器人停止访问该页面?
像这样:
header("HTTP/1.0 404 Not Found");
我测试它时看起来不错,但我担心SE机器人(可能还有用户代理)会感到困惑。
答案 0 :(得分:3)
你到了那里。这个想法是正确的 - 你想给他们一个404.但是,只需要一个微小的修正:如果客户端使用HTTP / 1.1进行查询而你使用1.0回答,一些客户端会感到困惑。
解决方法如下:
header($_SERVER['SERVER_PROTOCOL']." 404 Not Found");
答案 1 :(得分:1)
SE机器人 DO 在看到此内容时感到困惑:
HTTP/1.1 200 OK
<h1>The page your requested does not exist</h1>
或者这个:
HTTP/1.1 302 Object moved
Location: /fancy-404-error-page.html
解释here:
为不存在的页面返回404或410以外的代码(或 将用户重定向到另一个页面,例如主页,而不是 返回404)可能会有问题。首先,它告诉搜索引擎 那个URL上有一个真实的页面。结果,该URL可能是 抓取并将其内容编入索引。由于Googlebot花费的时间 在不存在的页面上,您的唯一URL可能不会被发现 快速或经常访问,您的网站的爬网覆盖范围可能是 受影响(同样,你可能不希望你的网站排名很好 搜索查询找不到文件)。
您对以编程方式发送404标头的想法是正确的,它指示搜索引擎他们请求的URL不存在,并且他们不应该尝试抓取并编制索引。设置响应状态的方法:
header($_SERVER["SERVER_PROTOCOL"] . " 404 Not Found");
header(":", true, 404); // this is used to set a header AND modify the http response code
// ":" is used as a hack to avoid specifying a real header
http_response_code(404); // PHP >= 5.4
答案 2 :(得分:1)
well-behaved crawler尊重您网站顶层的robots.txt。如果您想要排除抓取工具,那么@ SalmanA的回复将起作用。示例robots.txt文件如下:
User-agent: *
Disallow: /foo/*
Disallow: /bar/*
Disallow: /hd1/*
它需要所有人都可读。请注意,这不会让用户离开页面,只是一个尊重robots.txt的机器人,大多数人都这样做。