Я хочу работать с простым 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 нашел ваш скрипт.