возвращать пользовательские страницы ошибок в nginx, flask - PullRequest
0 голосов
/ 29 октября 2018

Я пробовал другие ответы в SO, например:

Возвращает пользовательскую страницу ошибки 403 с nginx

nginx + uwsgi + flask - отключение пользовательских страниц ошибок

nginx не обслуживает мою страницу об ошибках

и

ссылки:

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors

http://nginx.org/en/docs/http/ngx_http_core_module.html#error_page

но все еще не может возвращать пользовательские страницы ошибок - nginx продолжает возвращать свои собственные страницы.

Работая в локальном env, flask возвращает пользовательские HTML-страницы.

При публикации в nginx, не более.

Вот что я хочу получить:

  1. если пользователь нажмет /js/, маршрут вернется 403, а внутренние файлы будут /js/myJS.js

  2. Если файл /js/myJS.js не существует, вернуть 404

  3. Если что-то идет не так, как надо, скажем API в колбе, которая ломается (не должно :))> return 500

Моя колба конфигурация такая:

@application.errorhandler(404)
def error_404(e):
    application.logger.error('Page Not Found: %s', (request.path))
    #return render_template('404.html'), 404
    return render_template("404.html", error = str(e)), 404

// other errors are handled similarly

и шаблон 404.html находятся в папке var/www/mysite/templates.

Страницей ошибки являются статические файлы, нет ресурсов, обслуживаемых из фляги, кроме HTML-шаблона.

Теперь, в моей конфигурации nginx Я обрабатываю такие ошибки:

root var/www/mysite;
# update: tried to handle custom errors with proxy_intercept_errors on; 
# still no success
proxy_intercept_errors on;


# static is the directory that serve the subdirectory /js
# HOW COULD I RETURN 403 if /js is hit directly, but not /js/myfile.js ? 
# I tried to add deny all and allow only my server up, but did not worked out

location /static {
        expires 1M;
        alias /var/www/mysite/static;
        access_log off;
        add_header Cache-Control "public";
        allow #myserverip;
        deny all;
    }

    error_page 403 /403.html;
    location = /403.html {
        root /var/www/mysite/templates/;
        internal;
    }


    error_page 404 /404.html;
    location = /404.html {
        root /var/www/mysite/templates/;
        # internal;
        allow all;  
    }

    # also with the following no success: nginx white internal page is still displayed 
    error_page 404 http://example.com/404.html; 

что я пытаюсь установить внутреннее или закомментировать его; что я пытаюсь установить разрешить все (как в ответе выше, так что ответ), несмотря ни на что, nginx вернет свою пользовательскую страницу 404, а не из папки шаблонов.

Я также пытался настроить папку для отката, например:

## Fallback Directory
location @error {
    root /var/www/error;
}

но все равно безуспешно - всегда белая страница 404 от nginx.


Что не так в моей конфигурации?

Хотелось бы лучше понять, как в диалоговом окне фляг и nginx выявляются ошибки.

Я понял, что после публикации nginx будет обрабатывать ошибку, но не понимал, как обработанная ошибка обрабатывается между flask и nginx: что произойдет, когда пользователь нажал на маршрут "неправильного" ресурса? это nginx перехватывает это? это колба? Это UWSGI? как они передают мяч?

Также, пожалуйста, поделитесь советом: как я могу запросить страницы ошибок в nginx, например для тестирования плохих запросов 403 и 500?

...