我目前已经设置了一个与 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 的精确(非常规)匹配。这也将确保最高优先级:
接下来,您似乎不需要类型的 URL
/auth/test.php/foo
来转发到不同的 PHP 文件。fastcgi_split_path_info
所以彻底摆脱。实际
/auth/test.php
脚本是处理请求的脚本。因此,只需将其名称放在 fastcgi 指令中:最后,这
try_files $uri =404;
是无关紧要的,可能会造成更多麻烦。您已经知道该文件在那里,您不需要额外stat
的系统调用来检查它的存在。所以完整的片段可能是:
首先,如果您希望 URI 字符串完全匹配,则必须使用“=”。
对于 .php 进行处理,
location
必须是这样的:无论 PHP 的版本如何,这两行代码都允许处理 PHP。