Получение версии HTTP 505, не поддерживаемой по протоколу HTTPS, но не по протоколу HTTP - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь вызвать GET API с параметром, в котором есть пробел:

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

Конечная точка обращается к балансировщику нагрузки (nginx), который перенаправляет запрос на подходящий компьютер.

В ответ я получаю 505 Ошибка HTTP версии не поддерживается.Но когда я делаю тот же запрос к балансировщику нагрузки, используя 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.

нет ничего, что могло быбыть возможной причиной, по которой машина получает запрос другим способом?

1 Ответ

0 голосов
/ 05 октября 2018

Вся проблема. Происходит из-за пробела в вашем 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.Это кажется правильным.

...