Quiero agregar un encabezado personalizado para la respuesta recibida del servidor detrás de nginx.
Si bien add_header
funciona para respuestas procesadas por nginx, no hace nada cuando proxy_pass
se usa.
Quiero agregar un encabezado personalizado para la respuesta recibida del servidor detrás de nginx.
Si bien add_header
funciona para respuestas procesadas por nginx, no hace nada cuando proxy_pass
se usa.
Respuestas:
Hay un módulo llamado HttpHeadersMoreModule que le brinda más control sobre los encabezados. No viene con Nginx y requiere instalación adicional. Con él, puede hacer algo como esto:
location ... {
more_set_headers "Server: my_server";
}
Eso "establecerá el encabezado de salida del servidor en el valor personalizado para cualquier código de estado y cualquier tipo de contenido". Reemplazará los encabezados que ya están configurados o los agregará si no están configurados.
Secure
y HttpOnly
banderas en una cookie de respuesta ? Sin embargo, la cookie de respuesta de destino solo tiene la cookie name
y los expire
atributos.
add_header
funciona tan bien con proxy_pass
como sin. Hoy realicé una configuración en la que he usado exactamente esa directiva. Sin embargo, tengo que admitir que también he tenido problemas para configurar esto sin recordar exactamente la razón.
Ahora mismo tengo una configuración que funciona y contiene lo siguiente (entre otros):
server {
server_name .myserver.com
location / {
proxy_pass http://mybackend;
add_header X-Upstream $upstream_addr;
}
}
Antes, nginx 1.7.5
add_header funcionaba solo en respuestas exitosas, en contraste con HttpHeadersMoreModule mencionado por Sebastian Goodman en su respuesta .
Desde nginx 1.7.5
, puede usar la palabra clave always
para incluir encabezados personalizados incluso en respuestas de error. Por ejemplo:
add_header X-Upstream $upstream_addr always;
Limitación: no puede anular el server
valor del encabezado utilizando add_header
.
add_header X-Upstream $upstream_addr always;
X-Upstream: 10.10.10.10
vs X-Upstream: 53c2d28edefdf501ab7c92e02a0c1687
(md5 probablemente no sea útil para enmascarar la infraestructura, pero transmite la idea).
add_header
directiva. No tiene que enviarlos en absoluto.
Como escribe Oliver:
add_header
funciona tan bien conproxy_pass
como sin.
Sin embargo, como escribe Shane, a partir de Nginx 1.7.5, debe aprobar always
para obteneradd_header
trabajar con respuestas de error, así:
add_header X-Upstream $upstream_addr always;
Agregar un encabezado con add_header
funciona bien con el pase de proxy, pero si hay un valor de encabezado existente en la respuesta, apilará los valores.
Si desea establecer o reemplazar un valor de encabezado (por ejemplo, reemplazar el Access-Control-Allow-Origin
encabezado para que coincida con su cliente para permitir el uso compartido de recursos de origen cruzado), puede hacer lo siguiente:
# 1. hide the Access-Control-Allow-Origin from the server response
proxy_hide_header Access-Control-Allow-Origin;
# 2. add a new custom header that allows all * origins instead
add_header Access-Control-Allow-Origin *;
Entonces proxy_hide_header
combinado con add_header
le da el poder de establecer / reemplazar valores de encabezado de respuesta.
Se puede encontrar una respuesta similar aquí en ServerFault
Nota: proxy_set_header
sirve para configurar los encabezados de la solicitud antes de que la solicitud se envíe más, no para configurar los encabezados de respuesta (estos atributos de configuración para los encabezados pueden ser un poco confusos).
Puedes probar esta solución:
En su location
bloque cuando use proxy_pass
haga algo como esto:
location ... {
add_header yourHeaderName yourValue;
proxy_pass xxxx://xxx_my_proxy_addr_xxx;
# Now use this solution:
proxy_ignore_headers yourHeaderName // but set by proxy
# Or if above didn't work maybe this:
proxy_hide_header yourHeaderName // but set by proxy
}
No estoy seguro de que sea exactamente lo que necesita, pero intente manipular este método y tal vez el resultado se ajuste a su problema.
También puedes usar esta combinación:
proxy_hide_header headerSetByProxy;
set $sent_http_header_set_by_proxy yourValue;
location / { proxy_pass http://127.0.0.1:8080/; proxy_hide_header "Access-Control-Allow-Origin"; if ($http_origin ~* "^https://(example.com|www.example.com)$") { add_header Access-Control-Allow-Origin "$http_origin"; } }