为什么我的 404 返回 200 状态码?

jwe*_*rre 0 http nginx http-status-code-404 http-status-code

不知道为什么,但我所有的错误页面都以 200 响应。这对我来说有点奇怪,页面存在但它们不应该有相应的状态代码吗?如何让 Nginx 使用 404 状态代码呈现我的 404 页面?

例如:

? curl -I http://example.com/404
HTTP/1.1 200 OK <<--------------------------- WTF! THIS SHOULD BE 404!!
Server: nginx/1.8.0
Date: Tue, 17 Apr 2018 02:24:04 GMT
Content-Type: text/html; charset=UTF-8
...
Run Code Online (Sandbox Code Playgroud)

这是我的配置的相关部分:

server {

listen 80 default_server;

server_name example.com;
root /var/www/example/static;
index index.html;

try_files $uri $uri/ $uri.html =404;

# error pages
error_page 400 =400 /400; # bad request
error_page 401 =401 /401; # unauthorized
error_page 403 =403 /403; # forbidden
error_page 404 =404 /404; # not found
error_page 408 =408 /408; # timeout
error_page 500 502 503 504 =500 /500; # error

} 
Run Code Online (Sandbox Code Playgroud)

文档中指出:

... 可以更改响应代码 ... 使用“=response”语法

该页面确实存在,但error_page在配置中设置了 an应该会更改该页面的状态。例如,如果您使用curlGoogle 的 404,您会得到正确的结果:

curl -I https://www.google.com/404
HTTP/2 404  <<--------------------------- Ahhh, much better.
content-type: text/html; charset=UTF-8
referrer-policy: no-referrer
content-length: 1564
Run Code Online (Sandbox Code Playgroud)

我需要我的 404 页面来生成 404 状态代码,因为我从应用程序的其他部分重定向到它。这对人类很好,但对机器不利,因为重定向会产生 302 后跟 200 而不是 404。

Mic*_*ton 5

正如 joeqwerty 在评论中所说,nginx正确返回 200,因为您要求提供一个存在的文档。如果您请求不存在的文档,您只会得到 404 。尝试这样做。(并且这样的文档是否存在于其他服务器上完全无关。)

  • @jwerre 而不是调用 `curl -I http://example.com/404` 尝试调用类似 `curl -I http://example.com/404_this_is_random_rubbish` 的东西,你应该会看到你期望的 404。如果您直接调用实际的 404 页面(而不是响应另一个错误页面请求而传递它),那么正确的响应 ** 是 ** 200 - 因为请求的页面确实存在。 (3认同)
  • @jwerre 你不知道这是否是 Google 的 404 页面,因此它是否退出,或者它是否是 404.html 或 /errors/404 或其他一些东西。为什么您认为他们将 404 页面放在与您相同的位置?或者它甚至是一个静态页面?正确的做法是返回 200 如果引用了实际页面并且这就是您的服务器正在执行的操作。为什么你“需要”你的 404 页面来产生 404 状态?这是不正确的行为,虽然可以使用重写来做到这一点,但您可能会为真正的 404 服务中断该页面的服务。这比它的价值要多得多。 (2认同)
  • @jwerre 所以给 404 页面一个不太容易被猜到的 URL。这就是其他人所做的。 (2认同)