
Я пытаюсь создать запасной вариант для моей страницы error_page. В принципе, логика должна быть примерно такой:
- загрузить foobar.html
- не существует на удаленном сервере -> загрузите 404.html с удаленного сервера, чтобы отобразить страницу 404
- не существует на удаленном сервере -> загрузить 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 по умолчанию.
решение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.