Nginx
Nginx 位置指令 - 文件被下載
我目前已經設置了一個與 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; }