我目前已设置了一个 Nginx 位置块,当且仅当它以 开头和结尾时,它才与 uri 匹配/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
指令会处理这种情况,但显然不是。谢谢。
答案1
首先,您的正则表达式是 URI 字符串的精确匹配。因此,请改用 NGINX 的精确(非常规)匹配。这还将确保最高优先级:
location = /auth/test.php {
接下来,您似乎不需要/auth/test.php/foo
转发到不同 PHP 文件的类型 URL。因此,请完全删除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;
}
答案2
首先,如果您想要 URI 字符串完全匹配,则必须使用“=”。
location = /auth/test.php {
为了处理 .php 文件,location
必须是这样的:
location /auth/test.php {
fastcgi_param SCRIPT_FILENAME $request_filename;
include fastcgi_params;
}
无论 PHP 是什么版本,这两行都可以处理 PHP。