Nginx

名稱中包含查詢字元串的文件。需要 nginx 忽略內容標頭的查詢字元串

  • October 6, 2018

有一個包含大量文件的目錄。這些都是來自備份的靜態文件。

問題是某些文件的名稱如下:

mystyle.css?version=3.3.1

提供文件時,nginx 沒有檢測到文件是 css,因此不發送Content-Type: text/css標頭,這給我帶來了一些麻煩。重命名文件非常麻煩,因為它需要重命名大量文件,同時還要在 html、javascript 等內部重命名它們。是否可以幫助 nginx 忽略 ? 和查詢字元串的其餘部分,只檢查 mystyle.css 以確定要服務的 mimetype 類型?

這對於像 SVG 圖像這樣的東西來說尤其麻煩,因為瀏覽器不會檢測到它們,除非您將它們作為image/svg+xml.

Nginx 查看最終文件名並得出副檔名是css?version=3.3.1. 它在types塊中查找它並沒有找到匹配項,因此使用 的值default_type來代替。

如果您在一個文件夾下擁有所有 CSS 類型文件,而在另一個文件夾下擁有所有 SVG 類型文件 - 或者如果不同類型的 URI 路徑是唯一的,則可以為特定位置中的所有文件設置 mime-type:

location /css {
   types { }
   default_type text/css;
}

從問題的第一行開始,您表示有一個目錄包含大量文件,可能具有不同的 mime 類型。

您可以使用map帶有正則表達式的指令來辨識文件的 mime 類型。您需要為目錄中包含的每種類型的文件添加一行。我的範例僅包含一些。該文件/etc/nginx/mime.types包含 Nginx 通常配置為辨識的類型,但您只需將當​​前歸檔的文件類型添加到此目錄。

map $request_uri $type {
   default         application/octet-stream;
   ~*\.css         text/css;
   ~*\.js          application/javascript;
}

server {
   ...
   location /some/path {
       default_type "";
       types { }
       add_header Content-Type $type;
   }
}

免責聲明:這可能是一個 hack,但似乎有效。

將 設置default_path為空字元串和空types塊,可以防止 Nginx 添加自己的 Content-Type 標頭。

有關指令的詳細資訊,請參閱本文件。map

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