3

我有一個PHP網站,其中一些內容是用戶生成的。例如,用戶可以上傳調整大小並可以請求的照片。我想在我的nginx配置中根據MIME類型(Content-Type響應標頭)指定Expires標頭(用於緩存)。根據nginx中的動態內容類型過期標題

這是我目前的配置(我的主機會自動添加http{}server{}):

charset utf-8; 

types { 
    text/css   css; 
    text/javascript  js; 
} 

gzip on; 
gzip_types text/html text/css text/javascript application/json image/svg+xml; 

location/{ 
    if (!-e $request_filename) { 
     rewrite . /index.php last; 
     break; 
    } 


    set $expire 0; 

    if ($upstream_http_content_type = image/jpeg) { set $expire 1; } 
    if ($upstream_http_content_type = image/png) { set $expire 1; } 
    if ($upstream_http_content_type = image/gif) { set $expire 1; } 
    if ($upstream_http_content_type = image/svg+xml) { set $expire 1; } 
    if ($upstream_http_content_type = text/css) { set $expire 1; } 
    if ($upstream_http_content_type = text/javascript) { set $expire 1; } 

    if ($expire = 1) { 
     expires max; 
    } 
} 

這適用於靜態文件(如.png文件 - 他們得到正確Expires頭),但它有沒有影響從index.php動態生成的內容(根本沒有Expires頭)。有人知道我在做什麼錯嗎?

+0

什麼是動態文件?你的意思是當用戶上傳真實文件(例如圖像)和你的網絡應用程序傳輸它(例如調整大小)並將其發回時,動態文件出現,這是一個動態文件,是嗎? – emka86

+0

@ emka86我改變了問題來澄清那部分。我的意思是由'index.php'動態生成的內容。 – Jonathan

+0

我檢查你的conf截圖,從我的角度來看它是不可能工作的。你沒有任何'root'指令,所以nginx甚至不知道從哪裏開始搜索任何文件。接下來你使用'index.php',但沒有任何'proxy_pass'或'fastcgi_pass'指令將nginx請求重定向到某個PHP應用程序。 Nginx自己不知道如何處理'.php'文件。請檢查一下這兩個:http://kbeezie.com/nginx-configuration-examples/或http://wiki.nginx.org/FullExample – emka86

回答

1

在你location塊有無處放置當你通過請求PHP的Web應用程序,所以我可以假設你做別的地方,例如在location塊像這樣的:

location /index.php { 
    # your code 
} 

您的配置當用戶請求一個存在的靜態文件時,那麼第一個if指令不會被計算出來,並且一切都很順利。問題啓動時動態文件用戶的請求,然後nginx的輸入您的if塊:

if (!-e $request_filename) { 
    rewrite . /index.php last; 
    break; 
} 

這裏發生了什麼?您正在使用last標誌,rewrite指令以及nginx的文檔對此有何評論?

last - 完成當前重寫指令的處理並重新啓動進程(包括重寫),並從所有可用位置搜索URI上的匹配項。

根據這一規範時文件是動態你犯了一個重寫index.php和執行離開if塊乃至location塊以下if塊檢查content-type甚至沒有檢查。我想它找到然後location的網址/index.php,那裏你沒有設置expires max

您是否理解這個問題的解釋?

解決這個太移動/複製您的順序if塊檢查content-type到地方,你的配置通執行PHP的Web應用程序(的index.php)...或rewrite指令刪除last標誌,如果它不做任何其他麻煩。

歐凱,所以我答應了一點修正你的conf文件:有改變你的location街區二:

location /index.php { 
    if ($upstream_http_content_type ~ "(image/jpeg)|(image/png)|(image/gif)|(image/svg+xml)|(text/css)|(text/javascript)") { 
     expires max; 
    } 
    if ($sent_http_content_type ~ "(image/jpeg)|(image/png)|(image/gif)|(image/svg+xml)|(text/css)|(text/javascript)") { 
     expires max; 
    } 
} 

location/{ 
    if ($upstream_http_content_type ~ "(image/jpeg)|(image/png)|(image/gif)|(image/svg+xml)|(text/css)|(text/javascript)") { 
     expires max; 
    } 
    if ($sent_http_content_type ~ "(image/jpeg)|(image/png)|(image/gif)|(image/svg+xml)|(text/css)|(text/javascript)") { 
     expires max; 
    } 
    try_files $uri /index.php =404; 
} 

首先location塊是您index.php和動態響應,而第二個是對靜態文件。在第二個中,我們添加標題expires max作爲上游標題和標準標題(只是可以肯定)。我在這裏使用了一個if塊,用於在您的配置中使用正則表達式匹配定義的所有類型。最後,我們使用try_files指令,這意味着如果有可能獲得基於url的靜態文件,它將被獲得,並以其他方式嘗試url /index.php或僅返回http404。第一個位置塊僅用於url /index.php。 我在配置root指令中找不到任何應用程序,它應該指向應用程序的根文件夾。嘗試添加這也(root doc)。

我希望這能解決您的問題。

+0

感謝您的解釋。我部分理解了這個問題。然而,這是我第一次與nginx合作,而且我沒有足夠的經驗來提出解決方案。我現在在問題中粘貼了我的整個配置;你會介意再看一下,看看你是否能看到我應該改變的東西?再次感謝! – Jonathan

+0

這真的是整個conf?沒有更多的「位置」塊?您的應用程序無法正常工作,因爲您只希望針對'expires'這個問題? – emka86

+0

是的,這就是全部。我的'index.php'讀取請求的路徑並處理所有內容(這就是爲什麼所有對非現有文件/文件夾的請求都被重寫爲'index.php')的原因。效果很好,除了'Expires'標題。 在PHP中處理大多數事情的原因是該項目不僅在nginx上運行,而且在Apache上運行。出於這個原因,我想在HTTP服務器配置中儘可能少地執行操作。 – Jonathan