nginx+fastcgi+php-fpm 标准配置步骤 = 404

nginx+fastcgi+php-fpm 标准配置步骤 = 404

我想要使​​用类似的简单 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 获取的 straceurl和使用 url我获取的url 。因此,第一个以 '\n' 结尾,第二个以 '\t' 结尾,无法理解原因。test.php/SCRIPT_NAME/test.php\v\ntest.phpSCRIPT_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 能够找到您的脚本。

相关内容