nginx sirve archivos estáticos directamente si no coinciden con las reglas de reescritura

nginx sirve archivos estáticos directamente si no coinciden con las reglas de reescritura

Acabo de pasar de Apache a nginx y tengo problemas con algunas configuraciones que no parecen funcionar. Tengo estas reglas de mi archivo .htaccess anterior que estoy intentando convertir a reglas de 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 puede ver, esto dice que cada archivo que no existe pero que sigue el patrón especificado debe ser servido mediante un script php. Sin más procesamiento. Luego, para cada archivo que no sea estático y no exista en el disco, envíelos al archivo principal index.php.

Sé cómo servir archivos estáticos directamente y sé cómo establecer la primera regla. Lo que no sé cómo resolver es que ambas condiciones funcionen juntas. Esto es lo que tengo hasta ahora:

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 dije, si dejo locationhabilitadas esas tres directivas, los archivos estáticos se entregarán directamente, pero los archivos de estilos o js que sigan el patrón especificado devolverán el error 404 (ya que no se encuentran en esa ubicación específica). Si comento la directiva de archivos estáticos y habilito las reglas de reescritura para css/js que deben ser entregadas por un script, los archivos estáticos dentro de los directorios css/js no se entregarán (se devuelve una página en blanco), pero todos los demás archivos estáticos sí se entregarán. servido normalmente.

Realmente ya no sé qué hacer. Pasé horas buscando en Internet cómo resolver esto, pero todo lo que intenté no funcionó.

Respuesta1

Solución:

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
}

información relacionada