有一臺運行 nginx php-fpm 的服務器,除了對 404 的不一致處理外,一切都運行良好。
example.com/fakepath
example.com/fakepath.php
第一個鏈接傳遞到我們的應用程式,該應用程式處理 404 頁面、日志記錄等。第二個鏈接在我們的應用程式外部回傳錯誤,空白頁面僅顯示“找不到檔案”。
這是由 nginx php 塊還是 php-fpm 端引起的?獲取不存在的 php 檔案的任何設定都會傳遞回 index.php 而不是 not found 錯誤?
location / {
index index.php index.html;
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_split_path_info ^(. \.php)(/. )$;
include fastcgi_params;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
}
uj5u.com熱心網友回復:
發生這種情況是因為正則運算式匹配位置 like 的優先級location ~ \.php$ { ... }大于前綴位置 like location / { ... }。locationdirectve檔案中描述的精確位置選擇演算法:
位置可以由前綴字串或正則運算式定義。正則運算式使用前面的“
~*”修飾符(用于不區分大小寫的匹配)或“~”修飾符(用于區分大小寫的匹配)指定。為了找到與給定請求匹配的位置,nginx 首先檢查使用前綴字串(前綴位置)定義的位置。其中,選擇并記住匹配前綴最長的位置。然后按照它們在組態檔中出現的順序檢查正則運算式。正則運算式的搜索在第一次匹配時終止,并使用相應的配置。如果找不到與正則運算式的匹配項,則使用之前記住的前綴位置的配置。...
如果最長匹配前綴位置具有“
^~”修飾符,則不檢查正則運算式。此外,使用“
=”修飾符可以定義 URI 和位置的精確匹配。如果找到完全匹配,則搜索終止。例如,如果“/”請求頻繁發生,定義“location = /”將加快這些請求的處理速度,因為搜索在第一次比較后立即終止。
以上意味著當您收到/fakepath.php請求時,它的處理直接轉到location ~ \.php { ... }您沒有任何try_files指令的地方。當您通過SCRIPT_FILENAMEFastCGI 引數將不存在的檔案路徑傳遞給 PHP-FPM 守護程式回應時,您遇到的錯誤來自 PHP-FPM 守護程式回應。最簡單的是try_files在第二個位置塊中添加另一個指令:
location ~ \.php$ {
try_files $uri /index.php$is_args$args;
...
}
但是,由于此處try_files描述的指令行為,您將無法PATH_INFO使用當前配置設定FastCGI 引數。我認為您的 PHP Web 應用程式并不真正需要它,因為PATH_INFO無論如何您的正則運算式將始終為空(如果您真的這樣做了,請將您的正則運算式更改為此處\.php($|/)顯示的那樣并使用建議的解決方法)。我知道現在真正在使用的唯一現代軟體是Craft CMS,它們中的大多數(包括最流行的 WordPress、Laravel Framework 等)都依賴于FastCGI 引數。很可能您可以安全地從配置中洗掉這些和行(正如我已經說過的,使用PATH_INFOREQUEST_URIfastcgi_split_path_info ^(. \.php)(/. )$;fastcgi_param PATH_INFO $fastcgi_path_info;\.php$regex 與location指令這些行無論如何都不做任何事情)。
uj5u.com熱心網友回復:
雖然@Ivan 的解決方案很棒,但在性能方面try_files,除了現有的解決方案之外,您還要添加另一個解決方案。這意味著即使對于有效的 SEO 友好 URL,例如/fakepath,NGINX 也會例行檢查 file /fakepath、 dir/fakepath和 file/index.php是否存在。
您可以在不影響性能的情況下實作所需的效果(即擺脫來自 PHP-FPM 的“未指定輸入檔案”),如下所示:
location ~ \.php$ {
fastcgi_intercept_errors on;
error_page 404 /404.html;
...
}
fastcgi_intercept_errors on;將使 NGINX 能夠處理error_page位置中指定的指令。也就是說,它將從 PHP-FPM 看到 404 狀態,并將使用指定的靜態頁面處理錯誤。
的/404.html所有可能不存在,然后NGINX將提供其內部404頁(所期望的效果)。
您可能想要指定,例如/404.php或其他特定于框架的未找到/錯誤處理程式是動態的。在這種情況下,最好快取它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/376068.html
上一篇:nginx重定向特定的子域和路徑
下一篇:如何重定向NGINX
