摘要

我有一个指向内部和外部域的Web应用程序,并且我希望robots.txt阻止对内部域的所有访问,但允许对外部域的所有访问。

问题详细信息

我有一个简单的Nginx服务器块,用于代理Django应用程序(请参见下文)。如您所见,此服务器块可响应任何域(由于缺少server_name参数)。但是,我想知道如何标记特定域,例如Nginx将为其提供自定义robots.txt文件。

更具体地说,假设网域example.com和www.example.com将提供htdocs目录中的默认robots.txt文件。 (由于设置了“root/sites/mysite/htdocs”,并且robots.txt文件位于/sites/mysite/htdocs/robots.txt)

但是,我还希望域“example.internal.com”(与example.com指向同一服务器)具有自定义的robots.txt文件;我想创建一个自定义robots.txt,以便Google不会对该内部域编制索引。

我考虑过复制服务器块并在其中一个服务器块中指定以下内容。然后以某种方式覆盖该服务器块中的robots.txt查找。

"server_name internal.example.com;"

但是,仅出于此目的复制整个服务器块似乎并不十分干燥。

我还考虑过使用if语句检查主机头是否包含内部域。然后以这种方式提供自定义robots.txt文件。但是Nginx说If Is Evil

为内部域提供自定义robots.txt文件的好方法是什么?

感谢您的帮助。

这是我正在使用的服务器块的代码示例。
upstream app_server {
  server unix:/sites/mysite/var/run/wsgi.socket fail_timeout=0;
}

server {
  listen 80;

  root /sites/mysite/htdocs;

  location / {
      try_files $uri @proxy_to_app;
  }

  location @proxy_to_app {
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_set_header X-Forwarded-Protocol $scheme;
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Scheme $scheme;
     proxy_set_header Host $http_host;
     proxy_redirect off;
     proxy_pass   http://app_server;
  }
}

最佳答案

您可以使用 map 定义条件变量。在服务器指令之外添加此:

map $host $robots_file {
    default robots.txt;
    internal.example.com internal-robots.txt;
}

然后可以将变量与 try_files 一起使用,如下所示:
server_name internal.example.com;

location = /robots.txt {
    try_files /$robots_file =404;
}

现在,您的根目录中可以包含两个robots.txt文件:
robots.txt
internal-robots.txt

关于django - Nginx:备用域使用不同的robots.txt,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26308779/

10-15 00:41