Я хочу работать с простым 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, работает нормально.
Первый блок работает для меня (с косой чертой в конце или без него), поэтому в вашей конфигурации может быть другое конфликтующее место, которое предотвращает вариант из работы.
Второй блок не захватывает начальные символы '/' 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
, а ваш корневой каталог - установлен на / var / www
, SCRIPT_FILENAME
должен быть /index.php
вместо /var/www/index.php
, который является набором nginx по умолчанию.
Итак, вам нужно вставить каталог внутри chroot перед $ fastcgi_script_name
в вашей конфигурации, чтобы PHP-FPM нашел ваш скрипт.