nginx stellt statische Dateien direkt bereit, wenn sie nicht durch Umschreiberegeln abgedeckt sind

nginx stellt statische Dateien direkt bereit, wenn sie nicht durch Umschreiberegeln abgedeckt sind

Ich bin gerade von Apache zu Nginx gewechselt und habe Probleme mit einigen Konfigurationseinstellungen, die nicht zu funktionieren scheinen. Ich habe diese Regeln aus meiner vorherigen .htaccess-Datei, die ich in Nginx-Regeln konvertieren möchte:

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]

Wie Sie sehen, bedeutet dies, dass jede Datei, die nicht existiert, aber dem angegebenen Muster folgt, von einem PHP-Skript bereitgestellt werden muss. Keine weitere Verarbeitung. Senden Sie dann jede Datei, die nicht statisch ist und nicht auf der Festplatte existiert, an die Hauptdatei index.php.

Ich weiß, wie man statische Dateien direkt bereitstellt, und ich weiß, wie man die erste Regel erstellt. Was ich noch nicht weiß, ist, diese beiden Bedingungen zusammenzubringen. Hier ist, was ich bisher habe:

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
}

Wie gesagt, wenn ich alle drei locationAnweisungen aktiviert lasse, werden statische Dateien direkt bereitgestellt, aber Stil- oder JS-Dateien, die dem angegebenen Muster folgen, geben den Fehler 404 zurück (da sie an diesem bestimmten Ort nicht gefunden werden). Wenn ich die Anweisung für statische Dateien kommentiere und die Umschreiberegeln für CSS/JS aktiviere, die von einem Skript bereitgestellt werden müssen, werden statische Dateien in CSS/JS-Verzeichnissen nicht bereitgestellt (eine leere Seite wird zurückgegeben), aber alle anderen statischen Dateien werden normal bereitgestellt.

Ich weiß wirklich nicht mehr, was ich tun soll. Ich habe stundenlang im Internet nach einer Lösung gesucht, aber alles, was ich versucht habe, hat nicht funktioniert.

Antwort1

Lösung:

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
}

verwandte Informationen