我正在测试一个设置,我希望让 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 设置为第二个位置的某个位置