Nginx 404 页面行为

Nginx 404 页面行为

我有以下 nginx 服务器配置:

server {
    listen 80;
    server_name example.com
    root   /server/root;

    index index.php;

    error_page 404 = /index.php;

    location ~ \.php$ {
        try_files $uri =404;

        proxy_pass         http://127.0.0.1:8080;
        proxy_redirect     off;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header   X-Request-URI    $request_uri;
    }

}

我想要的行为是,当 nginx 遇到对不存在的文件的请求时,它会通过 404 页面显示 index.php 页面。问题是,当 apache(被代理回的页面)收到请求时,它似乎仍在尝试解析原始请求。如果我转到http://example.com/blahblah,我收到错误:

The requested URL /blahblah was not found on this server.

这是 apache 错误。我怎样才能使 index.php 显示为 404 页面,就像它是静态文件一样?

答案1

您使用的是哪个版本的 nginx?此问题已在 1.1.12 中得到解决:http://nginx.org/en/CHANGES

编辑:如果您无法更新,您可以用以下代码替换当前的error_page和try_files:

location / {
  try_files $uri $uri /index.php;
}

location ~ \.php$ {
  # Leave the =404 at the end so we don't 500 when /index.php doesn't exist
  try_files $uri /index.php =404;

  proxy_pass         http://127.0.0.1:8080;
  proxy_redirect     off;
  proxy_set_header   Host $host;
  proxy_set_header   X-Real-IP        $remote_addr;
  proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
  proxy_set_header   X-Request-URI    $request_uri;
}

答案2

nginx 将不得不拦截 Apache 的响应并识别 404 版本,并返回其自己的版本。

如果 nginx 没有办法做到这一点,那么也许您可以将 Apache 配置为不返回任何内容 - 从而触发 nginx 自己的 404 状态?

答案3

如果您坚持使用 Apache,则必须设置 Apache 重写规则以将 404 错误发送到您的应用程序,而不是在 nginx 的配置中。

相关内容