Estou tentando encontrar a melhor maneira de reescrever essa regra para que funcione no nginx:
RewriteCond %{REQUEST_URI} !^/clip-art/.*$
RewriteCond %{REQUEST_URI} !^/Clip-Art/.*$
RewriteCond %{REQUEST_URI} !^/cgi-bin/.*$
RewriteCond %{REQUEST_URI} !^/images/.*$
RewriteCond %{REQUEST_URI} !/invitation/
RewriteCond %{REQUEST_URI} !/designer/
RewriteRule ^/(.*)/(.*)/(.*)/(.*)$ /clip-art/$1/$2/$3/$4 [r=301,nc,l]
Eu sei que posso fazer algo como:
if ($request_uri !~ "/designer") {
rewrite ^/(.*)/(.*)/(.*)/(.*)$ /clip-art/$1/$2/$3/$4 permanent;
}
Mas obviamente isso só funciona com um dos nomes das pastas. Como faço para funcionar com vários nomes de pastas?
Expressões regulares são relativamente ineficientes e geralmente desencorajadas em configurações Nginx quando outros métodos seriam suficientes. Existem alguns casos aqui que não requerem regexes:
Se você estiver apenas veiculando imagens estáticas de pelo menos três delas, podemos simplificar ainda mais. O
^~
prefixo significa que essas regras terão precedência sobre as regras baseadas em regex, que de outra forma teriam precedência. Embora isso tenha muitos usos, ele pode atuar como um recurso de segurança ao lidar com diretórios contendo apenas recursos estáticos. Se alguém conseguir enviar um arquivo PHP ou algum outro código executável que normalmente seria tratado por um local regex, o local pré-regex (com^~
) vencerá e o arquivo não será executado. Também omiti o típico$uri/
porque não é realmente aplicável a diretórios de recursos estáticos.Quanto às condições restantes, o Nginx é projetado para corresponder a partir do início de cada URI. Idealmente, você pode lidar com esses tipos de cenários em seu aplicativo, em vez de no Nginx. No entanto, neste caso específico, um regex relativamente eficiente pode ser escrito:
https://stackoverflow.com/questions/406230/regular-expression-to-match-a-line-that-doesnt-contain-a-word contém um exemplo de como usar regex para encontrar strings que não contêm determinadas palavras.
Use essa abordagem regex em sua
location
diretiva e, em seguida, use suarewrite
instrução dentro dolocation
bloco.Além disso, sugiro que você use
.+
(uma ou mais correspondências) em vez de.*
(zero ou mais correspondências) como seu curinga narewrite
diretiva.