nginx + fastcgi + php-fpm从标准configuration= 404步骤

我想工作像http://host/test.php简单的url,请注意有没有尾/尾。

我从nginx站点的标准configuration开始+ 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无尾/不工作。

我尝试改变到这样的configuration:

  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)只有在/etc/php-fpm.d/www.conf设置了chroot才会出现这个问题

2)我发现使用strace的URL与test.php/ php-fpm得到了SCRIPT_NAME/test.php\v\n和URL test.php我得到了SCRIPT_NAME/test.php\v\t 。 所以第一个以'\ n'结尾,第二个以'\ t'结尾不能得到原因。

更新2看起来像一个错误,我尝试1.9.13和相同的configuration,不工作与1.8.1,工作正常。

第一个块适用于我(带有或不带有斜线),因此在您的configuration中可能会有另一个冲突的位置,从而阻止一个变体的工作。

第二个块没有捕获URI的前导'/',所以testingif (!-f $document_root$fastcgi_script_name)总是失败。

我假设你的php-fpmconfiguration必须已经知道你的文档根目录,因为通常把SCRIPT_FILENAME定义为完整的path:

 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 

当为PHP-FPM使用chroot时,你必须定义相对于chroot环境的SCRIPT_FILENAMESCRIPT_FILENAME告诉PHP-FPM在哪里find你的脚本。

例如,如果您的网站索引页在/var/www/index.php ,并且您的chroot设置为/var/www ,则SCRIPT_FILENAME必须是/index.php而不是/var/www/index.php ,这是默认的nginx集合。

因此,您必须在您的configuration中的$fastcgi_script_name之前的chroot中插入目录,以便PHP-FPM能够find您的脚本。