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

Как прозрачно перенаправить пользователя без перезаписи URL, когда страница не существует?

У меня есть веб-приложение node с nginx, выступающим в качестве прокси.

Вот server блок для этого сайта:

server {
        listen 80;

        server_name subdomain.example.org;

        location / {
                # Offline handling
                error_page https://example.org/502

                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_set_header X-NginX-Proxy true;

                proxy_pass http://127.0.0.1:4567;
                proxy_redirect off;

                # Socket.io Support
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }
}

Если веб-приложение когда-либо выйдет из строя, то error_page Директива отправляет пользователя за пределы сайта, но в конечном итоге URL-адрес изменяется. Можно ли отправить пользователя на этот сайт, но сохранить тот же URL-адрес в браузере?

Как док говорит:

Если нет необходимости изменять URI во время внутреннего перенаправления, можно передать обработку ошибок в указанное место:

location / {
    error_page 404 = @fallback; }

location @fallback { 
    proxy_pass http://backend;
}

Вам также нужно будет поставить on в proxy_intercept_errors директива.

Кроме того, чтобы уважать формат URL-адреса, который вы указываете в своем примере (https://example.org/502) мне пришлось использовать $folder переменная.

Наконец, вам нужно будет настроить решатель директива.

В заключение у вас будет что-то вроде этого:

location / {
   proxy_intercept_errors on;
   error_page 404 = @fallback;
   proxy_pass        http://127.0.0.1:4567;
   ...
   ...
}

location @fallback {
   resolver 8.8.8.8;   # <-- Put your own DNS Server here
   set $folder "502";
   proxy_pass https://example.org/$folder/;
}