我一直在研究一个利用映射到lambda函数的API网关的新项目。 lambda函数包含一个Kestrel .NET Web服务器,它通过API Gateway通过代理接收请求。我已将API网关重新映射到实际的子域,以确保一些品牌一致性。一切都很好;但是,我最近实施了Elmah.IO,以便更好地了解在这种不寻常的环境中出现的错误。
现在,每天大约一到五次,api网关URL正在请求无法完成的robots.txt文件。我不希望API能够完成此请求,因为API不是为了提供静态内容。我的问题是;我怎样才能阻止这些请求的发生呢?
是什么原因导致请求API网关URL?是因为它是通过我的主机网站的链接直接检测到的吗?它使用CORS来访问API,因此机器人可能会将API检测为完全独立的域并尝试抓取它。如果是这样,是否有一些配置我可以添加到我的Web API以强制我的设计文本响应robots.txt请求?
答案 0 :(得分:3)
网络抓取工具会查找他们可以找到的任何网址,并希望将所有网址编入索引。如果在任何地方都有对您的API网关URL的引用,则可能是Googlebot并且其朋友会找到它。他们没有任何理由提前知道某个域只适用于编程访问,从他们的角度来看,API URL就像其他任何URL一样。
行为良好的网络抓取工具会在请求其他任何内容之前请求域的robots.txt文件,以查看他们是否应该加载域中的任何其他网页。
我讨厌告诉别人他们问的是错误的问题,但实际上你希望抓取工具来请求它。这就是你如何告诉抓取者你不希望他们要求的其他页面。 robots.txt惯例的目的是,它应该是一种简单的方式将您的愿望传达给爬虫。在Web的早期阶段,将文本文件放入根文件夹非常容易。随着Web的发展,站点的编程驱动程度更高,而不是文件驱动,因此约定难度较大。但你不能真正停止抓取者请求robots.txt,因为他们无法知道他们是否应该在该主机名上点击其他网址,直到他们处理它为止,所以他们总是会去尝试请求它。你只需要处理它。
以下是我为API网关创建robots.txt所采取的步骤:
创建名为robots.txt
和路径robots.txt
的新资源。请注意,默认情况下,控制台将尝试将路径设为robots-txt
(使用连字符),因此您需要确保更改它。
为GET创建该资源的新方法。
选择模拟的集成类型。
在“集成响应”部分中,展开状态200部分,展开“正文映射模板”部分,然后单击application/json
。将内容类型更改为text/plain
,并将所需的robots.txt内容¹放在模板框中。单击“保存”。
返回并打开“方法响应”部分。展开状态200的部分,单击铅笔图标以编辑application/json
响应正文类型。将其更改为text/plain
,然后点击复选标记进行保存。
text/plain
内容类型进行响应。¹我希望大多数API系统都想使用standard method to exclude all robots:
User-agent: * Disallow: /
答案 1 :(得分:1)
在研究了一下之后,我最终只是尝试动态生成robots.txt响应的文本文件。我正在阅读文章:http://rehansaeed.com/dynamically-generating-robots-txt-using-asp-net-mvc/
这让我有了动态生成请求的想法。因此,我设置了以下内容:
[Route("/")]
public class ServerController : Controller
{
[HttpGet("robots.txt")]
public ContentResult GetRobotsFile()
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.AppendLine("user-agent: *");
stringBuilder.AppendLine("disallow: *");
return this.Content(stringBuilder.ToString(), "text/plain", Encoding.UTF8);
}
}