Apache-2.2

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

  • September 13, 2013

我剛從 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 目錄中的靜態文件(返回空白頁),但所有其他靜態文件將是正常送達。

我真的不知道該怎麼辦了。我花了幾個小時在網際網路上查找如何解決這個問題,但我嘗試的一切都沒有奏效。

解決方案:

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
}

引用自:https://serverfault.com/questions/537569