有一个主 Web 应用程序位于某个 example.ru 域,一个 Json API 位于 api.example.ru 子域。对 api.example.ru/sitemap 的请求会动态生成 xml 站点地图文件。必须将对 example.ru/sitemap.xml 的请求重定向到此 API 访问点。设置 Nginx 的经验不是很丰富,所以这有点困难。当前配置(我省略了多余的):
server {
listen 80;
server_name example.ru;
root /home/web/example.ru/www/dist;
index index.html;
location = /sitemap.xml {
proxy_pass "http://api.example.ru/sitemap";
}
location ~ \. {
try_files $uri =404;
}
location / {
add_header X-Frame-Options "SAMEORIGIN";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_pass http://localhost:3000;
proxy_redirect off;
proxy_read_timeout 1m;
}
}
server {
listen 80;
server_name api.example.ru;
root /home/web/example.ru/www/api/public;
index index.php;
location ~ \. {
try_files $uri =404;
}
location / {
try_files /index.php =404;
include /etc/nginx/fastcgi.conf;
fastcgi_pass unix:/run/php/php7.3-fpm.sock;
fastcgi_index /index.php;
}
}
使用此配置,服务器将 example.ru/sitemap.xml 请求重定向到 Web 应用程序,这就是显示 Web 应用程序错误的 404 页面的原因。服务器最初选择了正确的位置(通过将 location = /sitemap.xml 块的内容替换为 return 200 'Test'; 来检查),但是在代理时,请求到达同一个服务器块,而不是第二个对应的块api.* 子域。它现在带有 $uri = /sitemap,因此自然选择了位置 / 并显示了 Web 应用程序。DNS 配置正确,并且 Web 应用程序和 API 在它所针对的域上可用,对 api.example.ru/sitemap 的本地 curl 请求会正确返回站点地图。一般来说,我显然误解了 Nginx 配置中的某些内容。我将不胜感激。
如果我正确理解问题,您需要在 proxypass 位置指定 Host 标头:
在您的配置选项中,您指定了代理服务器的地址,它已解析,但主机仍保留在原始请求中,因此您再次到达相同的服务器块。