Nginx:不同域名使用不同的robots.txt文件

9

摘要

我有一个单一的 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;"

但是为了这个目的复制整个服务器块似乎不太DRY。我也考虑过使用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;
  }
}
1个回答

18

您可以使用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

非常感谢您的方法,putnamhill。看起来正是我想要做的。 - Joe J

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接