Acabei de mudar do Apache para o nginx e estou lutando com algumas configurações que parecem não funcionar. Eu tenho essas regras do meu arquivo .htaccess anterior que estou tentando converter para regras nginx:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(js|css)/([a-z0-9\.]+)\.(js|css)$ $1/index.php?hash=$2 [L,QSA]
RewriteCond %{REQUEST_URI} !\.(gif|jpe?g|s?html|css|js|cgi)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]
Como você pode ver, isso indica que cada arquivo que não existe, mas segue o padrão especificado, deve ser servido por um script php. Nenhum processamento adicional. Então, para cada arquivo que não seja estático e não exista no disco, envie-os para o arquivo index.php principal.
Sei como servir arquivos estáticos diretamente e sei como fazer a primeira regra. O que não sei resolver é fazer com que essas duas condições funcionem juntas. Aqui está o que tenho até agora:
location / {
try_files $uri $uri/ /index.php;
}
location /js/ {
rewrite ^/js/([a-z0-9.]+).js$ /js/index.php?hash=$1 break;
}
location /css/ {
rewrite ^/css/([a-z0-9.]+).css$ /css/index.php?hash=$1 break;
}
# serve static files directly
location ~* \.(?:jpg|jpeg|gif|css|png|js|ico)$ {
access_log off;
expires 30d;
add_header Pragma public;
add_header Cache-Control "public";
}
location ~ \.php$ {
# basic settings for php files
}
Como eu disse, se eu deixar todas essas três location
diretivas habilitadas, os arquivos estáticos serão servidos diretamente, mas os estilos ou arquivos js que seguem o padrão especificado retornarão o erro 404 (já que não foram encontrados naquele local específico). Se eu comentar a diretiva de arquivos estáticos e ativar as regras de reescrita para css/js que devem ser servidos por um script, os arquivos estáticos dentro dos diretórios css/js não serão servidos (uma página em branco será retornada), mas todos os outros arquivos estáticos serão servido normalmente.
Eu realmente não sei mais o que fazer. Passei horas pesquisando na internet como resolver isso, mas tudo que tentei não funcionou.
Responder1
Solução:
location / {
try_files $uri $uri/ /index.php;
}
# serve static files directly
location ~* \.(?:jpg|jpeg|gif|css|png|js|ico)$ {
access_log off;
expires 30d;
add_header Pragma public;
add_header Cache-Control "public";
try_files $uri @fallback;
}
location @fallback {
rewrite ^/(js|css)/([a-z0-9.]+)\.(js|css)$ /$1/index.php?hash=$2;
}
location ~ \.php$ {
# basic settings for php files
}