Я пытаюсь настроить nginx с помощью php-fpm, чтобы большинство запросов передавалось одному php-скрипту.
Расположение каталогов такое как показано ниже:
assets/...
index.php
Я бы хотел, чтобы URL-адреса работали так:
/ -> index.php
/foo -> index.php
/bar/baz?spam=ham -> index.php
/assets -> assets folder
index.php
должен иметь PATH_INFO
, установленный на '/'
, '/ foo '
и ' / bar / baz '
соответственно.
Ближайшая конфигурация, которую я выяснил, следующая:
location / {
try_files $uri /index.php/$uri$is_args$args;
}
location /assets {
try_files $uri =404;
}
location /index.php {
include snippets/fastcgi-php.conf;
include fastcgi_params;
fastcgi_pass unix:/var/run/php5-fpm.sock;
}
Однако PATH_INFO
всегда имеет дополнительный /
(например, '//'
в первом случае). Переход на /index.php$url$is_args$args
работает для всех случаев, кроме /
, что приводит к 404.
Я, конечно, мог бы изменить сценарий, чтобы обработать лишние /
, но он кажется немного грязным.
Я пытался найти и прочитать руководство, но не могу понять его, любой указатели?
Вы прокомментировали, что ваши фрагменты/fastcgi-php.conf
содержат:
fastcgi_split_path_info ^(.+\.php)(/.+)$;
Который, как вы заметили, не соответствует URI /index.php/
, что объясняет, почему вы получаете ответ 404.
Вы можете переопределить значение в фрагментах/fastcgi-php.conf
, поместив после него исправленное утверждение (предполагая, что вы не хотите редактировать системный файл). Например:
location / {
try_files $uri /index.php$uri$is_args$args;
}
location /index.php {
include snippets/fastcgi-php.conf;
include fastcgi_params;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
}
Просто поменяйте +
на *
так, чтобы /
совпадали, когда за ними больше ничего не следует.