Получение 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;

Ближайший к документу, который я могу найти по теме, находится здесь

Другие вопросы по тегам