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;
        ...
}