Получение 505 версии HTTP не поддерживается по HTTPS, но не по HTTP
Я пытаюсь вызвать GET API с параметром, в котором есть место:
https://abc.xyz/search/web/buildings/search/v2/city/new%20york
Конечная точка обращается к балансировщику нагрузки (nginx), который перенаправляет запрос на подходящий компьютер.
В ответ я получаю ошибку 505 HTTP Version Not Supported. Но когда я делаю тот же запрос к балансировщику нагрузки, используя HTTP (используя внутренний IP), он успешно возвращает ответ.
Вот соответствующие журналы доступа обоих случаев:
доступ к журналу nginx при вызове через http
"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
)
доступ к журналу nginx при вызове через https
"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
,
В чем может быть причина, по которой машина получает запрос другим способом?
2 ответа
Вся проблема возникает из-за места в вашем 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;
}
Кроме того, у вас есть разные конфигурации для http
а также https
серверы, посмотрите на http
один. Это кажется правильным.
Я получал 505 при попытке настроить переадресацию портов на nginx.
Для меня решением было добавить эту строку в мойlocation
блок, содержащийproxy_pass
директива:
proxy_http_version 1.1;
Ближайший к документу, который я могу найти по теме, находится здесь