Apache-2.2
如果重寫規則不匹配,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 目錄中的靜態文件(返回空白頁),但所有其他靜態文件將是正常送達。我真的不知道該怎麼辦了。我花了幾個小時在網際網路上查找如何解決這個問題,但我嘗試的一切都沒有奏效。
解決方案:
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 }