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

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

不知道为什么,但我的所有错误页面都响应 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
...

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

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

} 

在里面文档是状态:

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

页面确实存在,但error_page在配置中设置应该会改变该页面的状态。例如,如果您curl在 Google 上搜索 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

我需要我的 404 页面生成 404 状态代码,因为我从应用程序的其他部分重定向到该页面。这对人类来说没问题,但对机器来说却很糟糕,因为重定向会生成 302 后跟 200,而不是 404。

答案1

配置 NGINX 以指向该页面以处理真正的 404 错误。完成此操作后,当您想在某些地方重定向应用程序时,只需将它们重定向到虚假页面即可

先前的答案说得正确,当您在真实位置拉出 404 页面时,它将返回 200,因为您请求的页面确实存在。

答案2

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

相关内容