Назад | Перейти на главную страницу

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) Я обнаружил, что использую 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 и тот же конфиг, не работающий с 1.8.1, работает нормально.

Первый блок работает для меня (с косой чертой в конце или без него), поэтому в вашей конфигурации может быть другое конфликтное место, которое мешает работе одного варианта.

Второй блок не захватывает начальную букву '/' URI, поэтому тест if (!-f $document_root$fastcgi_script_name) всегда терпит неудачу.

Я предполагаю, что ваш php-fpm конфигурация должна уже знать корень вашего документа, потому что обычно определяют SCRIPT_FILENAME как полный путь:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

При использовании chroot для PHP-FPM вы должны определить 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 нашел ваш скрипт.