Назад | Перейти на главную страницу

Поведение страницы 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 обнаруживал запрос на несуществующий файл, он вместо этого показывал страницу index.php в виде страницы 404. Проблема в том, что кажется, что apache (то есть то, к чему возвращается проксирование) все еще пытается разрешить исходный запрос, когда он получает запрос. Если я пойду в http://example.com/blahblah, Я возвращаю ошибку:

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

Это ошибка apache. Как сделать так, чтобы index.php отображался как страница 404 точно так же, как если бы это был статический файл?

Какую версию 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;
}

Если вы настаиваете на использовании Apache, вам придется настроить правила перезаписи Apache для отправки в ваше приложение ошибок 404, а не в конфигурации nginx.

nginx должен будет перехватить ответ Apache, распознать версии 404 и вернуть свой собственный.

Если у nginx нет возможности сделать это, возможно, вы могли бы настроить Apache так, чтобы он ничего не возвращал, тем самым вызывая собственное состояние 404 nginx?