Nginx

通過 php-fpm 提供一些 js/html 文件

  • January 19, 2020

我有一個具有 nginx 和 wordpress 的 docker-compose 設置。我遵循了網路上的一個教程,一切似乎都很好。

但是我有一個關鍵外掛,它直接通過 PHP 生成幾個 html/js 文件。意思是 HTML 程式碼包含<script>帶有路徑的標籤/script.js,外掛擷取該特定名稱並以適當的內容響應。這裡不涉及 url-rewrite 模組,只有一些自寫(即來自外掛)

我不知道如何配置 nginx 以允許 fpm docker image 為伺服器端生成的 js 提供服務。

現在我有以下設置:

location / {
 try_files   $uri $uri/ /index.php?$query_string;
}
location ~* \.php$ {
 fastcgi_pass wordpress:9000;
 fastcgi_index index.php;
 include fastcgi_params;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
location ~ ^/(script1.js|script2.js) {
 fastcgi_pass wordpress:9000;
 fastcgi_index index.php;
 include fastcgi_params;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
location ~* \.(css|js|gif|ico|jpeg|jpg|png)$ {
 expires max;
 log_not_found off;
}

一旦我重新請求頁面,script1 和 script2 就會以 404 響應。

這通常可以實現嗎?

如果靜態文件存在,該try_files語句將提供靜態文件,否則將請求發送到/index.php. 因為script1.jsscript2.js文件不存在,所以它們由 處理/index.php,這就是你想要的。

location ~ ^/(script1.js|script2.js)andlocation ~* \.(css|js|gif|ico|jpeg|jpg|png)$塊打破了這個邏輯。

一種解決方案是刪除location ~ ^/(script1.js|script2.js)塊(這是錯誤的),並將try_files語句放入location ~* \.(css|js|gif|ico|jpeg|jpg|png)$塊中。

例如:

location / {
   try_files $uri $uri/ /index.php?$query_string;
}
location ~* \.php$ {
   ...
}
location ~* \.(css|js|gif|ico|jpeg|jpg|png)$ {
   try_files $uri /index.php?$query_string;
   expires max;
   log_not_found off;
}

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