Как использовать локальную error_page, когда удаленная error_page не найдена?

Я пытаюсь создать запасной вариант для моей error_page. По сути, логика должна быть примерно такой:

  1. load foobar.html
  2. не существует на удаленном сервере -> загрузить 404.html с удаленного сервера, чтобы показать страницу 404
  3. не существует на удаленном сервере - > загрузить 404.html в локальную файловую систему

Загрузка как localhost / 404.html , так и localhost / global404.html работает, но когда я нарушаю localhost / 404.html (удалив файл с http-сервера) он не показывает страницу global404.html , как я ожидал.

server {
    listen 80;
    server_name example.com www.example.com;
    proxy_intercept_errors on;

    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        error_page 404 /404.html;
    }

    location /404.html {
        proxy_pass http://localhost:3000/404.html;
        error_page 404 /global404.html;
    }

    location /global404.html {
        root /usr/share/nginx/html;
    }
}

Вышеупомянутое работает нормально, когда я нажимаю http: / /localhost/404.html (когда файл 404.html находится на удаленном сервере, он показывает, что когда я удаляю файл, он загружает файл global404.html).

Однако, когда я набираю несуществующую страницу, я просто получаю страницу nginx 404 по умолчанию.

2
задан 18 May 2020 в 03:41
1 ответ

Благодаря формулировке оставленного комментария к вопросу, мне удалось найти опцию recursive_error_pages, которая допускает каскадирование/рекурсивное error_pages. Я чувствую себя глупо из-за того, что пропустил это в документации.

Но, просто делая

server {
    listen      80;
    server_name example.com www.example.com;
    proxy_intercept_errors on;
    recursive_error_pages on;

    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        error_page 404 /404.html;
    }

    location /404.html {
        proxy_pass http://localhost:3000/404.html;
        error_page 404 /global404.html;
    }

    location /global404.html {
        root /usr/share/nginx/html;
    }
}

, работало очарование. Я люблю nginx.

1
ответ дан 17 May 2020 в 11:42

Теги

Похожие вопросы