我想要使用类似的简单 URL ,注意末尾http://host/test.php
没有尾随。/
我从 nginx 站点 + serverfault 的标准配置开始:
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^((?U).+\.php)(.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
include fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
}
结束http://host/test.php/
可以工作,但http://host/test.php
如果没有尾随/
则不工作。
我尝试更改为这样的配置:
location ~ \.php$ {
fastcgi_split_path_info ^/(.+\.php)(.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
include fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
}
我得到了 404,并从 php-fpm 获取
主要脚本未知
那么,您知道如何让http://host/test.php
工作不出现拖尾/
吗?我尝试了很多变体,但还是不明白哪里出了问题。我使用了 nginx 1.8.1
更新
1)chroot
仅当我设置时才会出现此问题/etc/php-fpm.d/www.conf
2)我发现使用php-fpm 获取的
strace
url和使用 url我获取的url 。因此,第一个以 '\n' 结尾,第二个以 '\t' 结尾,无法理解原因。test.php/
SCRIPT_NAME/test.php\v\n
test.php
SCRIPT_NAME/test.php\v\t
更新 2 看起来像是一个错误,我尝试了 1.9.13 和相同的配置,但 1.8.1 无法正常工作。
答案1
第一个块对我来说有效(带或不带尾随斜杠),因此您的配置中可能有另一个冲突的位置,从而阻止一种变体工作。
第二个块没有捕获 URI 的前导“/”,因此测试if (!-f $document_root$fastcgi_script_name)
总是失败。
我推测您的php-fpm
配置一定已经知道您的文档根目录,因为通常将其定义SCRIPT_FILENAME
为完整路径:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
答案2
当对 PHP-FPM 使用 chroot 时,您必须定义SCRIPT_FILENAME
相对于 chroot 环境的内容。SCRIPT_FILENAME
告诉 PHP-FPM 在哪里找到您的脚本。
例如,如果您的网站索引页在/var/www/index.php
,并且您的 chroot 设置为/var/www
,则SCRIPT_FILENAME
必须是/index.php
而不是/var/www/index.php
,这是 nginx 的默认设置。
因此,您必须在配置之前将目录插入 chroot 中$fastcgi_script_name
,以便 PHP-FPM 能够找到您的脚本。