如果重寫規則不匹配,nginx 會直接提供靜態文件

如果重寫規則不匹配,nginx 會直接提供靜態文件

我剛從 apache 遷移到 nginx,並且正在努力解決一些似乎不起作用的配置設定。我嘗試將先前的 .htaccess 檔案中的這些規則轉換為 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]

如您所知,這表示每個不存在但遵循指定模式的檔案都必須由 php 腳本提供服務。無需進一步處理。然後,對於每個非靜態且磁碟上不存在的文件,將它們傳送到主index.php檔案。

我知道如何直接提供靜態文件,並且知道如何制定第一條規則。我不知道如何解決的問題是讓這兩個條件一起工作。這是我到目前為止所擁有的:

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
}

正如我所說,如果我啟用所有這三個location指令,將直接提供靜態文件,但遵循指定模式的樣式或 js 文件將返回 404 錯誤(因為在該特定位置找不到它們)。如果我註釋靜態檔案指令並啟用必須由腳本提供的 css/js 重寫規則,則不會提供 css/js 目錄內的靜態檔案(返回空白頁面),但所有其他靜態檔案將被提供服務正常。

我真的不知道該怎麼辦了。我花了幾個小時在互聯網上查找如何解決這個問題,但我嘗試的一切都不起作用。

答案1

解決方案:

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
}

相關內容