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

Как установить пользовательские заголовки для 400 и 500 ответов сервера proxy_pass в Nginx?

Мне нужно установить разные значения настраиваемого заголовка ответа на основе ответа от кода ответа серверной части proxy_pass.

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

location /mypath {
    #for 200,301,302,etc "good" responses from 127.0.0.1:8080 I need to set value 60
    add_header X-MyCustomHeader 60;

    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8080;

    #for 404,403 responses from 127.0.0.1:8080 I need to set X-MyCustomHeader=5
    #for 500 responses from 127.0.0.1:8080 I need to set X-MyCustomHeader=1
}

Любая помощь приветствуется.

Я пришел к следующему решению. он решает следующие проблемы:

  1. Установите заголовки ответа HTTP на основе кода ответа от бэкэнда proxy_pass
  2. Разрешить серверу содержимое страницы 404 из бэкэнда, но все равно добавлять заголовки.

Известная проблема:

  1. технически он будет вызывать бэкэнд дважды, если это 404. Для меня это не проблема, поскольку я кэширую ответ 404 с небольшим ttl. Но для других это могло быть.

Мой источник:

location /mypath/ {
    add_header X-MyCustomHeader 60;

    include /etc/nginx/proxy_config.conf; #some proxy_pass headers
    proxy_pass http://127.0.0.1:8080;
    proxy_intercept_errors on;
    error_page 500 502 503 504 /50x.html;
    error_page 400 403 404 =404 /mypath/errors/404.html;
}

# custom 50x fallback page for /mypath/, server from the nginx itself
location /50x.html {
    add_header X-MyCustomHeader 1;

    root html;
}

# custom 40x fallback page for /mypath/, served from the backend - hack
location /mypath/errors/404.html  {
    add_header X-MyCustomHeader 5;

    include /etc/nginx/proxy_config.conf; #some proxy_pass headers
    proxy_pass http://127.0.0.1:8080;
    proxy_intercept_errors off;
}

Видеть этот вопрос как ссылка

и вот этот

Есть ли какие-либо проблемы / опасения по поводу этого подхода?