【发布时间】:2021-04-01 00:59:04
【问题描述】:
我有两个上游服务器 A (tomcat) 和 B (tomcat)。 从服务器 A,我正在发送带有“X-Accel-Redirect”标头的内部重定向,在 nginx.conf 中,我已将其重定向到服务器 B。
我正在从服务器 B 发送一个文件作为响应,并将响应的内容类型设置为 application/x-x509-ca-cert。然后显然 Nginx 将其转发给客户端。但是Nginx发给客户端的响应头是application/x-x509-ca-cert; charset=ISO-8859-1。
我自定义了日志输出,access.log 看起来像
application/x-x509-ca-cert application/x-x509-ca-cert; charset=ISO-8859-1 127.0.0.1 - - [31/Mar/2021:15:55:13] "GET /uri" 200
通过反复试验,我得出结论,此字符集仅在内部重定向期间附加。 一项此类测试仅使用一台上游服务器 B 完成,并直接提供响应而无需任何内部重定向。 在这种情况下,日志看起来像
application/x-x509-ca-cert application/x-x509-ca-cert 127.0.0.1 - - [31/Mar/2021:15:55:13] "GET /uri" 200
请解释为什么在内部重定向期间会发生这种情况。我找到了一个解决方案来去除这个字符集并读取“Content-Type”标题。
但我想了解为什么在内部重定向期间会观察到这种行为。
我的 nginx.conf 看起来像
events {
worker_connections 1024;
}
http {
log_format custom '$upstream_http_content_type $sent_http_content_type $remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log custom;
upstream A {
server A:444;
}
upstream B {
server B:442;
}
server {
listen 8445;
listen 443 ssl;
server_name A;
underscores_in_headers on;
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
if ($http_cookie ~ 'A') {
proxy_pass https://A;
break;
}
proxy_pass https://B;
proxy_redirect https://B/ https://$host:$server_port/;
}
location @internalRedirect {
internal;
proxy_set_header Host $host;
proxy_set_header customHeader true;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass https://B;
}
}
}
【问题讨论】: