nginx + fastcgi + php-fpm step from standard config = 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;
        }

end 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, работает нормально.

0
задан 6 April 2016 в 22:51
2 ответа

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

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

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

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
1
ответ дан 4 December 2019 в 16:39

При использовании chroot для PHP-FPM вы должны определить SCRIPT_FILENAME относительно среды chroot. SCRIPT_FILENAME сообщает PHP-FPM, где найти ваш скрипт.

Например, если индексная страница вашего веб-сайта находится в /var/www/index.php , а ваш корневой каталог - установлен на / var / www , SCRIPT_FILENAME должен быть /index.php вместо /var/www/index.php , который является набором nginx по умолчанию.

Итак, вам нужно вставить каталог внутри chroot перед $ fastcgi_script_name в вашей конфигурации, чтобы PHP-FPM нашел ваш скрипт.

0
ответ дан 4 December 2019 в 16:39

Теги

Похожие вопросы