我剛從 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
}