Para gerenciar redirecionamentos complexos, principalmente quando strings de consulta estão envolvidas, a diretiva map
pode ser usada.
Você não pode corresponder a string de consulta (nada do ?
em diante) às expressões location
e rewrite
, pois ela não faz parte do URI normalizado, mas a $request_uri
contém a solicitação original completa string de consulta.
A correspondência do $request_uri
pode ser problemática se os parâmetros não forem enviados em uma ordem consistente, também os URIs contendo caracteres estranhos serão codificados em porcentagem.
A diretiva map
pode corresponder strings e / ou expressões regulares. Consulte este documento para obter detalhes.
Por exemplo:
map $request_uri $redirect {
default 0;
~*^/index\.php\?(?<suffix>(forums|threads|users).*)$ /f/$suffix;
...
}
server {
...
if ($redirect) {
return 301 $redirect;
}
...
}
Sempre use capturas nomeadas em uma expressão regular map
block. A expressão mapeada é avaliada na instrução return
. Pelo que entendi, toda vez que nginx
encontra uma instrução contendo uma expressão regular (como rewrite
, alguns location
blocos e algumas if
declarações), as capturas numéricas são redefinidas . O uso de capturas nomeadas garante que elas permaneçam no escopo na instrução return
.
Consulte esta advertência sobre o uso de if
.