Temos um problema um pouco complicado para resolver em nossa configuração nginx. Atualmente temos um software instalado em nossa raiz de documentos. Este software usa um único ponto de entrada (index.php) e strings de consulta para mostrar o conteúdo. URLs de exemplo são:
/index.php?forums/forum-name.1
/index.php?threads/thread-name.1
/index.php?users/user-name.1
Etc...
Agora, estamos movendo este software para um subdiretório /f/
e instalando um novo software na raiz do documento. Este software TAMBÉM usa index.php (embora sem strings de consulta). Portanto, precisamos criar um conjunto de regras de reescrita para reescrever SOMENTE os URLs do software antigo. Ao mesmo tempo, também removeremos index.php dos URLs. Um conjunto de exemplos de mapeamentos é:
/index.php?forums/forum-name.1 --> /f/forums/forum-name.1
/index.php?threads/thread-name.1 --> /f/threads/thread-name.1
/index.php?users/user-name.1 --> /f/users/user-name.1
Então, basicamente, preciso redirecionar um determinado subconjunto de solicitações index.php (contendo apenas ?forums, ?threads, ?users, etc...), remover a parte index.php e enviar para o diretório /f/.
Eu brinquei com isso a manhã toda e simplesmente não consigo fazer funcionar como preciso.
Responder1
Para gerenciar redirecionamentos complexos, especialmente quando strings de consulta estão envolvidas, a map
diretiva pode ser usada.
Você não pode corresponder a string de consulta (qualquer coisa a partir de ?
agora) nas expressões location
and rewrite
, pois ela não faz parte do URI normalizado; no entanto, $request_uri
contém a solicitação original completa com a string de consulta.
A correspondência $request_uri
pode ser problemática se os parâmetros não forem enviados em uma ordem consistente e também os URIs contendo caracteres estranhos serão codificados em porcentagem.
A map
diretiva pode corresponder a strings e/ou expressões regulares. Veresse documentopara detalhes.
Por exemplo:
map $request_uri $redirect {
default 0;
~*^/index\.php\?(?<suffix>(forums|threads|users).*)$ /f/$suffix;
...
}
server {
...
if ($redirect) {
return 301 $redirect;
}
...
}
Sempre usecapturas nomeadasem uma map
expressão regular de bloco. A expressão mapeada é avaliada na return
instrução. Pelo que entendi, toda vez que nginx
encontro uma declaração contendo umexpressão regular(como rewrite
alguns location
blocos e algumas if
instruções), as capturas numéricas são redefinidas. Usandocapturas nomeadasgarante que eles permaneçam no escopo na return
declaração.
Veresse cuidadosobre o uso de if
.