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 так же, как если бы это был статический файл?

3 ответа

Решение

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

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

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

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

Другие вопросы по тегам