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

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

我正在尝试robots.txt为 nginx http 服务器下的所有虚拟主机进行设置。我能够在 Apache 中通过在 main 中输入以下内容来执行此操作httpd.conf

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

我尝试对 nginx 做类似的事情,通过在 nginx.conf 中添加以下行 (a) 和 (b) 作为 include conf.d/robots.conf

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

我尝试使用 '=' 甚至将其放入虚拟主机之一进行测试。似乎没有任何效果。

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

答案1

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

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

答案2

您可以直接在 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";
}

答案3

是否定义了其他规则?可能是 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. “正则表达式”位置优先于“前缀”位置

答案4

我对 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;
  }
}

相关内容