Nginx-кодирование (нормализация) части URI
у меня nginx location
директива, целью которой является" удаление " префикса локализации из URI для
3 ответов
Да, это поведение ожидается, хотя документы также говорят:
Если proxy_pass указан без URI, URI запроса передается на сервер в той же форме, что и отправленный клиентом при обработке исходного запроса, или полный нормализованный URI запроса передается при обработке измененного URI:
location /some/path/ {
proxy_pass http://127.0.0.1;
}
инженеры Nginx говорят то же самое: https://serverfault.com/questions/459369/disabling-url-decoding-in-nginx-proxy
однако если вы добавляете $request_uri в proxy_pass (и заранее удаляете локаль, она может работать как сказал инженером Nginx):
set $modified_uri $request_uri;
if ($modified_uri ~ "^/([\w]{2})(/.*)") {
set $modified_uri ;
}
proxy_pass http://example$modified_uri;
У меня был некоторый успех, используя следующее С Confluence и другими приложениями Atlassian за nginx, где специальные символы, такие как () [], вызывали проблемы.
location /path {
# [... other proxy options ...]
# set proxy path with regex
if ($request_uri ~* "/path(/.*)") {
proxy_pass http://server:port/path;
break;
}
# fallback (probably not needed)
proxy_pass http://server:port/path;
}
директива set может сделать трюк. Он сохраняет кодировку неповрежденной или, скорее, кодирует декодированную строку.
location ~ '^/(?<locale>[\w]{2})(/(?<rest>.*))?$' {
...
set $encoded_rest $rest
proxy_pass http://example/$encoded_rest;
...
}