Múltiplas condições para uma reconfiguração de Nginx

3

Estou tentando encontrar a melhor maneira de reescrever essa regra para que ela 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 que funcione com vários nomes de pastas?

    
por Andrew Newby 12.08.2017 / 10:07

2 respostas

3

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 exigem regexes:

location /clip-art/ {
    # ...
}

location /Clip-Art/ {
    # ...
}

location /images/ {
    # ...
}

location /cgi-bin/ {
    # ...
}

Se você está apenas exibindo 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 carregar um arquivo PHP ou algum outro código executável que normalmente seria manipulado por um local regex, o local pré-regex (com ^~ ) ganhará 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.

location ^~ /clip-art/ { try_files $uri =404; }
location ^~ /Clip-Art/ { try_files $uri =404; }
location ^~ /images/   { try_files $uri =404; }

location /cgi-bin/ {
    # ...
}

Quanto às demais condições, o Nginx é projetado para combinar desde o início de cada URI. Idealmente, você pode manipular esses tipos de cenários no aplicativo, em vez de no Nginx. No entanto, neste caso específico, uma regex relativamente eficiente pode ser escrita:

rewrite "^((?:/(?!designer|invitation)[^/]+){4})/?$" /clip-art$1 permanent;
    
por 12.08.2017 / 11:00
2

o link contém um exemplo como usar o regex para encontrar strings que não contenham certas palavras.

Use essa abordagem de regex na sua diretiva location e, em seguida, use sua instrução rewrite dentro do bloco location .

Além disso, sugiro usar .+ (uma ou mais correspondências) em vez de .* (zero ou mais correspondências) como seu caractere curinga na diretiva rewrite .

    
por 12.08.2017 / 10:46

Tags