Nginx

Nginx 位置指令 - 文件被下載

  • June 23, 2020

我目前已經設置了一個與 uri 匹配的 Nginx 位置塊,當且僅當它以/auth/test.php. 唯一的匹配是http://host/auth/test.php.

location  ~ ^/auth/test\.php$ {

       # Use try files or the if statement below. try_files is preferred
       # If the original URI ($uri) does not resolve into an existing file or directory, a 404 error is returned
       try_files $uri =404;

       fastcgi_split_path_info ^(.+\.php)(/.+)$; #

       fastcgi_param USERNAME $arg_username;
       fastcgi_param PASSWORD $arg_password;
       fastcgi_pass unix:/var/run/php5-fpm.sock;
       include fastcgi_params;
}

我的理解是,當 Nginx 嘗試匹配位置塊時,查詢參數不起作用。test.php當 uri 的形式為 時,會處理我的腳本http://host/auth/test.php?username=blah&password=blah。但是,如果我嘗試不帶查詢參數 () 的 uri,http://host/auth/test.php則腳本test.php會被請求它的人下載,這並不理想。有沒有辦法讓 Nginx 不處理這種類型的 uri 請求?我認為該try_files指令會處理這種情況,但顯然不是。謝謝。

首先,您的正則表達式與 URI 字元串完全匹配。因此,請改用 NGINX 的精確(非正常)匹配。這也將確保最高優先級:

location = /auth/test.php {

接下來,您似乎不需要類型的 URL/auth/test.php/foo來轉發到不同的 PHP 文件。fastcgi_split_path_info所以徹底擺脫。

實際/auth/test.php腳本是處理請求的腳本。因此,只需將其名稱放在 fastcgi 指令中:

fastcgi_param SCRIPT_FILENAME $document_root/auth/test.php;

最後,這try_files $uri =404;是無關緊要的,可能會造成更多麻煩。您已經知道該文件在那裡,您不需要額外stat的系統呼叫來檢查它的存在。

所以完整的片段可能是:

location = /auth/test.php {
   fastcgi_param USERNAME $arg_username;
   fastcgi_param PASSWORD $arg_password;
   fastcgi_pass unix:/var/run/php5-fpm.sock;
   fastcgi_param SCRIPT_FILENAME $document_root/auth/test.php;
   include fastcgi_params;
}

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