如何在Nginx中为所有虚拟主机全局设置robots.txt


13

我正在尝试为robots.txtnginx http服务器下的所有虚拟主机设置。通过在main中添加以下内容,我能够在Apache中做到这一点httpd.conf

<Location "/robots.txt">
    SetHandler None
</Location>
Alias /robots.txt /var/www/html/robots.txt

我尝试通过在nginx.conf和(b)中添加以下包含conf.d / robots.conf的行来与nginx做类似的事情

location ^~ /robots.txt {
        alias /var/www/html/robots.txt;
}

我尝试过使用'=',甚至将其放在虚拟主机之一中进行测试。似乎没有任何作用。

我在这里想念什么?还有另一种方法可以实现这一目标吗?


注意:无法将其设置为全局设置(即,在一个文件中设置,该文件适用于所有虚拟主机而没有包含语句)。可以在conf.d(或global.d [非标准])中设置robots.conf,并将其包含在每个虚拟主机配置中。其他所有答案都指向做同一件事的各种方式,即:proxy_pass,
retrun

Answers:


4

该位置不能在http块内使用。nginx没有全局别名(即,可以为所有虚拟主机定义的别名)。将全局定义保存在文件夹中并包括这些定义。

server {
  listen 80;
  root /var/www/html;
  include /etc/nginx/global.d/*.conf;
}

正如问题中给出的那样,我尝试通过将robots.conf放入conf.d文件夹中来进行操作。但是,它不能像全球性的那样工作。
2014年

续...就像您说的那样,Nginx没有全局别名。最终,解决方法是根据虚拟主机配置添加它。
2014年

43

您可以直接在nginx配置中设置robots.txt文件的内容:

    location = /robots.txt { return 200 "User-agent: *\nDisallow: /\n"; }

也可以添加正确的Content-Type:

    location = /robots.txt {
       add_header Content-Type text/plain;
       return 200 "User-agent: *\nDisallow: /\n";
    }

1
只是一个注释:我需要放置location = /robots.txt(注意等号),否则location ~* \.(txt|log)$下面的另一个匹配将其覆盖。
蜜蜂

如何将它添加到一个整齐的conf.d/robots.conf?因为这里不允许使用“ location”指令,这是合理的,但是它不适用于特定的服务器。我不确定@ user79644对此的答案。是否不可避免地将其添加到每个站点?
Pablo A

我还没有测试。但是,看起来与所讨论的类似,只是使用“返回”代替别名。我面临的问题是使其成为一个全球环境。这意味着我不应该在网站的每个.conf文件中重复该操作。我无法使全局方法与Apache一起工作。举例来说,不应该对开发服务器进行爬网。
阿努普

10

还有其他定义的规则吗?也许common.conf或其中包含的另一个conf文件覆盖了您的配置。以下之一绝对可以工作。

location /robots.txt { alias /home/www/html/robots.txt; }
location /robots.txt { root /home/www/html/;  }
  1. Nginx按照其出现顺序运行所有“ regexp”位置。如果任何“ regexp”位置成功,Nginx将使用该第一个匹配项。如果没有成功的“ regexp”位置,Nginx将使用上一步中找到的普通位置。
  2. “ regexp”位置优先于“ prefix”位置

它不能用作全局选项。但是,可以在虚拟主机的配置中使用。我使用了第一个(位置/robots.txt),甚至使用了我指定的那个问题('〜* /robots.txt')。两者都在虚拟主机的配置下完成。我认为'location''if {}'的使用属于'server'指令,这也许在全局范围内不起作用。
2013年

确保您有/robots.txt要别名的文件。我没有root工作的选择。
Shadoath

-1

我对acme挑战有相同的问题,但同样的原则也适用于您的情况。

我要解决的问题是,将所有站点移动到一个非标准端口,我选择8081了该端口,并创建了一个侦听端口80的虚拟服务器。该服务器代理对所有请求的代理127.0.0.1:8081,但对.well-known的请求除外。这几乎充当了全局别名,但又多了一个跃点,但是由于nginx的异步特性,因此不会导致性能显着下降。

upstream nonacme {
  server 127.0.0.1:8081;
}

server {
  listen 80;

  access_log  /var/log/nginx/acme-access.log;
  error_log   /var/log/nginx/acme-error.log;

  location /.well-known {
    root /var/www/acme;
  }

  location / {
    proxy_set_header    Host                $http_host;
    proxy_set_header    X-Real-IP           $remote_addr;
    proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
    proxy_set_header    X-Forwarded-Proto   $scheme;
    proxy_set_header    X-Frame-Options     SAMEORIGIN;

    # WebSocket support (nginx 1.4)
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    proxy_pass http://nonacme;
  }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.