Когда я просматриваю этот URL: http://localhost:8080/foo/%5B-%5D
server ( nc -l 8080
) получает его как есть:
GET /foo/%5B-%5D HTTP/1.1
Однако, когда я прокси это приложение через nginx (1.1.19):
location /foo {
proxy_pass http://localhost:8080/foo;
}
Тот же запрос, перенаправленный через порт nginx, пересылается с декодированным путем:
GET /foo/[-] HTTP/1.1
Декодированные квадратные скобки в пути GET вызывают ошибки на целевом сервере ( HTTP Status 400 - Недопустимый символ в пути ... ), поскольку они поступают без экранирования.
Есть ли способ отключить декодирование URL или закодировать его обратно, чтобы целевой сервер получал точно такой же путь при маршрутизации через nginx? Какое умное правило перезаписи URL?
Ответы:
Цитируя Валентина В. Бартенева (который должен получить полную оценку за этот ответ):
источник
http://localhost:8080/
наhttp://localhost:8080
случай, если у кого-то будет такая же ситуация, как и у меня.Обратите внимание, что декодирование URL, обычно известное как
$uri
«нормализация» в документации по nginx, происходит до IFF бэкэнда:либо любой URI указан внутри
proxy_pass
самого себя, даже если только конечный слеш сам по себе,или URI изменяется во время обработки, например, через
rewrite
.Оба условия четко задокументированы на http://nginx.org/r/proxy_pass (выделено мной):
Решение состоит в том, чтобы либо опустить URI, как в случае с OP, либо использовать действительно умное
rewrite
правило:Вы можете увидеть его в реальном времени в ответе о переполнении стека , включая контрольную группу.
источник
http://localhost:8080
). Если вы не согласны, вы можете взять его с авторами RFC 3986.