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

Сделайте так, чтобы папка страницы с ошибкой обслуживала ошибку 403 для внешних запросов

Я возился с сервером и сделал один из субдоменов прокси для службы, которая не всегда работает. В server блок выглядит так:

server {
    server_name servlet.example.org;
    error_page 502 /error/down.html;

    location / {
        proxy_pass http://127.0.0.1:12510;
        proxy_redirect default;
        proxy_intercept_errors on;
    }

    location /error/ {
        root /path/to/servlet;
        autoindex off;
    }
}

Это служит /path/to/servlet/error/down.html на любой запрос, когда служба не работает, и это здорово.

Моя проблема в том, что я хотел бы сделать любой внешний запрос к /error/ вернуть код состояния 403 со своей собственной страницей ошибок, например forbidden.html, также можно найти в /error/ папка. В internal Директива звучит так, как будто это то, что я хочу, но возвращает 404s. Я не могу просто заменить ошибку 404 на всем сервере на ошибку 403 с помощью error_page, потому что служба может возвращать собственные 404, и я хотел бы сохранить это.

Это возможно? Как бы я это сделал? Я пробовал, казалось бы, значимые комбинации internal и error_page но никуда не денешься.

За исключением этого, могу ли я хотя бы подать 403-й для всего, что иначе 404-й в /error/? Т.е. down.html и forbidden.html отображаются нормально, но все остальное получает 403 и отображает forbidden.html.

Я не могу довести сервер до 403 всего в /error/ внешне, но мне удалось занять второе место: до 403 все, что иначе не доступно.

Мне пришлось использовать перезапись, чтобы заставить его работать, потому что без него запрос на /error/ один только выдаст сообщение об ошибке nginx по умолчанию, а не пользовательское. Этого я до сих пор не могу понять.

server {
    server_name servlet.example.org;
    error_page 502 /error/down.html;
    error_page 403 /error/forbidden.html; # other error_pages for the
    error_page 404 /error/notfound.html;  #  proxy's output
    # ...

    location / {
        proxy_pass http://127.0.0.1:12510;
        proxy_redirect default;
        proxy_intercept_errors on;
    }

    location = /error/ {           # did you request /error/ ?
        rewrite .* /error/x last;  # not anymore!
    }                              # we can also omit autoindex now

    location /error/ {
        root /path/to/servlet;
        error_page 404 =403 /error/forbidden.html;
    }
}