我正在尝试指定自定义404页面并保留网址,但是使用下面的代码会显示错误nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in...
location / {
error_page 404 @404;
}
location @404 {
proxy_pass https://example.com/404.html;
}
有没有人知道这方面的解决方案?
答案 0 :(得分:0)
我在nginx 1.6.2上测试了你的配置。该错误消息会抱怨proxy_pass
中指定了路径的网址。仅指定https://server
即可,但无法解决您的问题。
还引入了命名位置(如@fallback
),以避免使用不存在的位置(以后可能会存在并导致问题)。但我们也可以使用服务器本身不应该存在的位置,例如:
location / { error_page 404 /xx-404-xx; }
location /xx-404-xx { proxy_pass https://example.com/404.html; }
重定向到相对URL只会导致内部nginx重定向,这不会像浏览器看到的那样更改URL。
编辑:以下是测试结果:
kenny:/etc/nginx/sites-enabled:# wget -S server.com/abc/abc
HTTP request sent, awaiting response...
HTTP/1.1 404 Not Found
Server: nginx/1.6.2
Date: Thu, 16 Jul 2015 07:01:38 GMT
Content-Type: text/html
Content-Length: 5
Connection: keep-alive
Last-Modified: Thu, 16 Jul 2015 07:00:59 GMT
ETag: "5037762-5-51af8a241434b"
Accept-Ranges: bytes
2015-07-16 09:01:38 ERROR 404: Not Found.
从apache访问日志:
1.2.3.4 - - [16/Jul/2015:09:01:38 +0200] "GET /test.html HTTP/1.0" 200 5 "-" "Wget/1.13.4 (linux-gnu)"
在nginx中,我有proxy_pass
到Apache webserver上的html文件,只有" test \ n"在里面。正如你所看到的,nginx获取了它,添加了来自Apache(Last-Mod,ETag)和Content-Length: 5
的头文件,因此它从Apache接收了html文件,但是wget没有保存404错误的内容。此外,如果许多浏览器小于1 kB(它们显示自己的错误页面),则默认情况下不会显示404错误。所以要么让你的404页面更大,要么你可以配置nginx来将它作为普通的html用" 200"结果代码(error_page 404 =200 /xx
)。
我不知道您为什么接收具有相同配置的外部重定向。尝试使用wget
查看nginx发送的标头。将http和https混合用于代理应该没有问题。尝试从配置中删除所有内容并仅测试此错误页面,也许某些其他指令导致此问题(而不是使用其他location
)。