我正在尝试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/; }
- Nginx 按照出现的顺序运行所有“regexp”位置。如果任何“regexp”位置成功,Nginx 将使用第一个匹配项。如果没有“regexp”位置成功,Nginx 将使用上一步找到的普通位置。
- “正则表达式”位置优先于“前缀”位置
答案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;
}
}