O nginx serve arquivos estáticos diretamente se não corresponder às regras de reescrita

O nginx serve arquivos estáticos diretamente se não corresponder às regras de reescrita

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 locationdiretivas 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
}

informação relacionada