http - 获取 505 HTTP 版本在 HTTPS 上不受支持,但在 HTTP 上不受支持

标签 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 中没有任何内容。

机器以不同方式获取请求的可能原因是什么?

最佳答案

整个问题的发生是因为发送到 tomcat 的 URL 中存在空格。因此,a 被解释为 HTTP 版本代码,而不是 HTTP/1.0。解决多余空间问题就可以解决问题。

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

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 服务器。那句话似乎是正确的。

关于http - 获取 505 HTTP 版本在 HTTPS 上不受支持,但在 HTTP 上不受支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52661688/

相关文章:

javascript - 使用 HTTP 日期格式的 javascript 获取当前日期

c++ - HTTP/S 代理起点

apache - 无法在 Windows 7 上启动 Tomcat 7 服务

java - 将 Ldap 组映射到 tomcat 中应用程序的角色

mysql - Node mysql 错误 : connect ECONNREFUSED

c# - 具有本地化数据的 ASP.NET MVC GET 表单

php - 为什么libcurl会计算 "4 TIMES"添加easy handles的个数?

tomcat - 设置 autoDeploy 和 deployOnStartup 会导致应用程序在启动时部署两次?

reactjs - 在 react SPA 中自动登录的 localStorage 中 JWT 的替代方案?

docker - 无法创建/etc/nginx/nginx.conf:目录不存在且启动容器导致 “exec:\”受监督的\“: executable file not found in $PATH”