Nginx中的自定义404

时间:2015-07-15 13:45:31

标签: nginx proxy rewrite http-status-code-404 proxypass

我正在尝试指定自定义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;
}

有没有人知道这方面的解决方案?

1 个答案:

答案 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)。