reescrita sem distinção entre maiúsculas e minúsculas nginx

15

Estou tentando tornar meus redirecionamentos nginx o mais limpos possível. Entendo que ~ * é sensível a maiúsculas e minúsculas, mas só posso fazê-lo funcionar no exemplo 2.

Exemplo 1

rewrite ^/foobar http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;

Exemplo 2 - Isso funciona, mas não é tão eficiente quanto a linha acima.

if ( $request_filename ~* foobar ) {
         rewrite ^ http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;
   }

Existe uma maneira de fazer redirecionamentos sem distinção entre maiúsculas e minúsculas no exemplo 1 sem deixá-lo muito confuso?

Obrigado.

milleruni
fonte

Respostas:

10

Acabei de ter (e consertei) esse mesmo problema e acabei aqui tentando encontrar a resposta. A documentação do nginx ( http://nginx.org/en/docs/http/ngx_http_rewrite_module.html ) não indica claramente que o ~ * só funciona dentro de uma instrução if, mas aparentemente esse é o caso.

Para obter correspondência de expressão regular sem distinção entre maiúsculas e minúsculas para uma reescrita de URL ngnix fora de uma instrução if, tive que usar o estilo Apache / Perl:

rewrite "(?i)foobar" http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;

Veja http://perldoc.perl.org/perlretut.html (pesquise por insensível). Parece também que o prefixo (? I) fora de um grupo de captura específico o aplica a toda a cadeia de pesquisa. Nota: Isso NÃO parece funcionar com "^ (? I) foobar" porque parece que o "^" está implícito.

Apenas para ter certeza, porém, e para tornar as futuras reescritas mais fáceis de manter e menos ambíguas, se você acabar fazendo várias delas, convém fazer algo assim:

location /foobar {
     rewrite "(?i)" http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;
}

Espero que isto ajude...

LawyerOnLinux
fonte
30

O que eu encontrei para fazer isso funcionar:

rewrite ^/foobar http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;

Você só precisa fazer isso:

rewrite (?i)^/foobar http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;

Isso significa apenas prefpend (? I) e, caso contrário, tudo é igual para a correspondência.

ogrrd
fonte
4
Essa deve ser a resposta aceita.
thekingoftruth
2
Obrigado. Tão simples e difícil de encontrar nos documentos do Nginx. Aprecio muito o ponteiro conciso!
PKHunter
0

Trabalhando em um site agora, descobri que isso parece funcionar também. Para todas as pessoas na mesma situação, eu estava nessas últimas horas.

location ~* ^/foobar {
  rewrite ^(.*)$ $scheme://$http_host/whatever/foobar redirect;
}
Pocketninja
fonte