HTTPS不支持但不支持HTTP的获取505 HTTP版本

时间:2018-10-05 08:43:45

标签: http tomcat nginx https http-status-code-505

我正在尝试使用带有空格的参数调用GET api:

https://abc.xyz/search/web/buildings/search/v2/city/new%20york

端点命中负载平衡器(nginx),该负载平衡器将请求重定向到合适的计算机。

在响应中,出现 505 HTTP Version Not Supported错误。但是,当我使用HTTP(使用内部IP)向负载均衡器发出相同的请求时,它将成功返回响应。

以下是这两种情况的相关访问日志:

通过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/$1;
            proxy_read_timeout 900;
    }

}

error.log中什么也没有。

可能是什么原因导致机器以其他方式获取请求?

1 个答案:

答案 0 :(得分:3)

整个问题正在发生,因为您的URL中有空间被发送到tomcat。因此,a被解释为HTTP版本代码,而不是HTTP/1.0。解决额外的空间问题将解决此问题。

rewrite块中使用location{}应该可以解决问题。

location /search/ {
    rewrite ^/search(/.*) /search/search$1 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;
}

此外,您对httphttps服务器有不同的配置,请看一下http。那似乎是正确的。