如何使用 varnish 为同一站点的子域名生成 robots.txt 文件?

如何使用 varnish 为同一站点的子域名生成 robots.txt 文件?

我想使用 Varnish 2.1 生成一个 robots.txt 文件。

这意味着domain.com/robots.txt使用 Varnish 提供服务并且也subdomain.domain.com/robots.txt使用 Varnish 提供服务。

robots.txt 必须硬编码到 default.vcl 文件中。这可能吗?

我知道 Varnish 可以在出错时生成维护页面。我正在尝试让它生成 robots.txt 文件。有人能帮忙吗?

sub vcl_error {
     set obj.http.Content-Type = "text/html; charset=utf-8";
     synthetic {"
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html>
   <head>
     <title>Maintenance in progress</title>
   </head>
   <body>
     <h1>Maintenance in progress</h1>
   </body>
 </html>
 "};
     return (deliver);
 }

答案1

首先,我想不出任何这样做的正当理由——它绝对应该以“传统”方式完成——由您的网络服务器提供文件(如果需要,由 Varnish 缓存)。在配置中硬编码“文件”违背了试图将数据和配置分开的大多数做法。也就是说,这将在 Varnish 3.0.2 上输出 robots.txt 文件(希望它也适用于 Varnish 2.1),而无需向后端服务器发出请求:

sub vcl_recv {
    #...
        if (req.url ~ "^/robots.txt$") {
            error 702 "OK";
        }
    #...
}

sub vcl_error {
    if (obj.status == 702) {
        set obj.status = 200;
        set obj.http.Content-Type = "text/plain; charset=utf-8";
        synthetic {"# robots.txt
User-agent: *
Disallow: /path/"};
    }
    return (deliver);
}

验证输出(我在虚拟机设置中执行了此操作,没有 robots.txt 文件 - 在使用上述配置之前结果是 404 错误):

curl --head http://www.example.com/robots.txt

HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 46
Accept-Ranges: bytes
Date: Tue, 20 Mar 2012 23:28:58 GMT
X-Varnish: 386675282
Age: 0
Via: 1.1 varnish
Connection: close

curl http://www.example.com/robots.txt

# robots.txt
User-agent: *
Disallow: /path/

我对此用例非常好奇。请告诉我们您采用此方法的原因,因为可能有更好的解决方案。

答案2

我没有用过 Varnish,但是这个真的听起来它不可能做到。Varnish 是一个缓存代理服务器,而不是网络爬虫。它如何“生成” robots.txt 文件?

如果您的子域名指向与域名相同的 IP 地址,Varnish 应该已经为其提供服务。您可以使用 varnish 将不同的(子)域名发送到不同的后端,但如果您没有专门配置它来执行此操作,那么所有请求都将发送到同一个后端。您可能需要确保您的后端将正确为不同的域名提供服务。

将要提供的文件内容放入 Varnish 配置文件中是没有意义的。您需要一个 HTTP 服务器来提供文件(存在于文件系统中),然后 Varnish 可以缓存该响应以避免在以后的请求中访问后端。Varnish 在动态生成的文件前面最有用,而在缓存文件系统已经缓存的静态文件时则不那么有用。

您在此试图解决什么问题?


通过查阅文档,我发现可以使用sub vcl_recv和直接从配置中提供响应,synthetic但 cyberx86 抢先写出了实际的答案。

Varnish 能够发送未从上游服务器收到的响应的目的是,有时您根本无法从上游服务器收到任何响应。Varnish 必须有自己的 502 和/或 504 响应。

即使从技术上来说可行,但对于 robots.txt 文件来说,这仍然没有多大意义。

相关内容