nginx - 请求由多个位置块处理

nginx - 请求由多个位置块处理

我正在测试一个设置,我希望让 nginx 提供静态媒体并将所有其他请求代理到另一个后端。我的配置如下:

location /media    {alias /var/httpd/media;}
location /         {proxy_pass http://127.0.0.1:8080;}

但是,如果请求的是不存在的媒体资源,例如/media/foo.js,nginx 会尝试查找/var/httpd/media/foo.js,如果找不到,它还会尝试将请求代理到127.0.0.1:8080。以下是 nginx 错误日志:

2012/05/18 17:09:21 [error] 10073#0: *1 open() "/var/httpd/media/foo.js" failed (2: No such file or directory), client: 127.0.0.1, server: www.example.com, request: "GET /media/foo.js HTTP/1.1", host: "www.example.com"
2012/05/18 17:09:21 [error] 10073#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 127.0.0.1, server: www.example.com, request: "GET /media/foo.js HTTP/1.1", upstream: "http://127.0.0.1:8080/media/foo.js", host: "www.example.com"

此外,我注意到,如果/var/httpd/media/foo.js 存在但无法被运行 nginx 的进程读取,则 nginx 不会尝试代理http://127.0.0.1:8080并返回403 Forbidden。错误日志:

2012/05/18 17:09:33 [error] 10073#0: *1 open() "/var/httpd/media/foo.js" failed (13: Permission denied), client: 127.0.0.1, server: www.example.com, request: "GET /media/foo.js HTTP/1.1", host: "www.example.com"

为什么第一种情况会导致处理两个位置块,而第二种情况只会导致处理媒体位置块?如何让第一种情况只处理媒体位置块而不尝试代理到后端?

注意:我还尝试^~向媒体位置块添加前缀:

location ^~ /media    {alias /var/httpd/media;}

/...但是这并没有改变 nginx 的行为,因为它在阻塞失败后继续陷入阻塞/media

答案1

我猜你已经将 error_page 404 设置为第二个位置的某个位置

相关内容