Aplique client_max_body_size apenas para um único URL ao usar reescritas

Aplique client_max_body_size apenas para um único URL ao usar reescritas

Esta questão é semelhante aAplicar client_max_body_size apenas para um único URLmas diferente devido à reescrita.

Eu gostaria de permitir um tamanho corporal maior em endpoint lg, mas não nos outros. Minha configuração existente é assim:

location /xyz/ {
  rewrite ^/xyz/(.*) /$1 break;
  proxy_pass http://{{proxy_host}}:{{proxy_port}}/;
}

Quero fazer algo parecido com o abaixo, mas continuo recebendo erros ou simplesmente não funciona:

location /xyz/ {
  rewrite ^/xyz/(.*) /$1 break;
  ...
  location /xyz/lg {
    client_max_body_size 2m;
  }
}

Tentei usar regex para o URL aninhado, mas só consegui:

nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location,

Responder1

O rewrite...breaké desnecessário, pois proxy_passum trailing /executa a mesma tarefa, portanto seu locationbloco original pode ser simplificado para:

location /xyz/ {
    proxy_pass http://{{proxy_host}}:{{proxy_port}}/;
}

A client_max_body_sizeinstrução precisa ser colocada dentro de um locationbloco, e esse bloco também precisa de uma proxy_passinstrução, pois essa diretiva não é herdada.

Por exemplo:

location /xyz/ {
    proxy_pass http://{{proxy_host}}:{{proxy_port}}/;
}
location /xyz/lg {
    client_max_body_size 2m;
    proxy_pass http://{{proxy_host}}:{{proxy_port}}/lg;
}

Você provavelmente pode aninhar os locationblocos, mas não faz sentido, pois não há nada para herdar.

Observe que a lgparte do URI é adicionada à nova locationinstrução e à nova proxy_passinstrução.

O exemplo definirá o client_max_body_sizepara qualquer URI quecomeça com /xyz/lg, por exemplo /xyz/lg, /xyz/lgfooe /xyz/lg/bar.

informação relacionada