获取 505 HTTP Version Not Supported on HTTPS 但不支持 HTTP
Getting 505 HTTP Version Not Supported on HTTPS but not on HTTP
我正在尝试使用其中包含 space 的参数调用 GET api:
https://abc.xyz/search/web/buildings/search/v2/city/new%20york
端点命中负载平衡器 (nginx),它将请求重定向到合适的机器。
在响应中,我收到 505 不支持 HTTP 版本错误。但是当我使用 HTTP(使用内部 IP)向负载平衡器发出相同的请求时,它 returns 响应成功。
两种情况的相关访问日志如下:
通过http调用时nginx的访问日志
"GET /search/web/buildings/search/v2/city/r%20c HTTP/1.1" S=200 487 T=0.005 R=- 10.140.15.199
通过 http 调用时机器的访问日志
"GET /search/search/web/buildings/search/v2/city/r%20c HTTP/1.0" 200 36
以上请求工作正常。但是当我们通过 https 请求时,机器中的请求会有所不同(应该是 d%20a
而不是 d a
)
通过 https 调用时 nginx 的访问日志
"GET /search/web/buildings/search/v2/city/d%20a HTTP/1.1" S=505 168 T=0.001 R=- 35.200.191.89
通过 https 调用时机器的访问日志
"GET /search/search/web/buildings/search/v2/city/d a HTTP/1.0" 505 -
这里是相关的nginx配置:
upstream searchtomcat {
least_conn;
server search-1:8080;
server search-2:8080;
}
server {
#listen 443 ssl http2;
listen 443;
client_max_body_size 100M;
...
location ~* ^/search/(.*)$ {
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://searchtomcat/search/search/;
proxy_read_timeout 900;
}
}
error.log
没有任何内容。
机器以不同方式获取请求的可能原因是什么?
整个 issue.is 的发生是因为 space 正在进入您的 URL 并被发送到 tomcat。因此,a
被解释为 HTTP 版本代码而不是 HTTP/1.0
。解决额外的 space 问题将解决问题。
在 location{}
块中使用 rewrite
应该可以解决问题。
location /search/ {
rewrite ^/search(/.*) /search/search break;
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://searchtomcat;
proxy_read_timeout 900;
}
此外,您对 http
和 https
服务器有不同的配置,请查看 http
的配置。那个似乎是正确的。
我正在尝试使用其中包含 space 的参数调用 GET api:
https://abc.xyz/search/web/buildings/search/v2/city/new%20york
端点命中负载平衡器 (nginx),它将请求重定向到合适的机器。
在响应中,我收到 505 不支持 HTTP 版本错误。但是当我使用 HTTP(使用内部 IP)向负载平衡器发出相同的请求时,它 returns 响应成功。
两种情况的相关访问日志如下:
通过http调用时nginx的访问日志
"GET /search/web/buildings/search/v2/city/r%20c HTTP/1.1" S=200 487 T=0.005 R=- 10.140.15.199
通过 http 调用时机器的访问日志
"GET /search/search/web/buildings/search/v2/city/r%20c HTTP/1.0" 200 36
以上请求工作正常。但是当我们通过 https 请求时,机器中的请求会有所不同(应该是 d%20a
而不是 d a
)
通过 https 调用时 nginx 的访问日志
"GET /search/web/buildings/search/v2/city/d%20a HTTP/1.1" S=505 168 T=0.001 R=- 35.200.191.89
通过 https 调用时机器的访问日志
"GET /search/search/web/buildings/search/v2/city/d a HTTP/1.0" 505 -
这里是相关的nginx配置:
upstream searchtomcat {
least_conn;
server search-1:8080;
server search-2:8080;
}
server {
#listen 443 ssl http2;
listen 443;
client_max_body_size 100M;
...
location ~* ^/search/(.*)$ {
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://searchtomcat/search/search/;
proxy_read_timeout 900;
}
}
error.log
没有任何内容。
机器以不同方式获取请求的可能原因是什么?
整个 issue.is 的发生是因为 space 正在进入您的 URL 并被发送到 tomcat。因此,a
被解释为 HTTP 版本代码而不是 HTTP/1.0
。解决额外的 space 问题将解决问题。
在 location{}
块中使用 rewrite
应该可以解决问题。
location /search/ {
rewrite ^/search(/.*) /search/search break;
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://searchtomcat;
proxy_read_timeout 900;
}
此外,您对 http
和 https
服务器有不同的配置,请查看 http
的配置。那个似乎是正确的。