Есть два хоста с пулом PHP-FPM каждый - one.com и two.com. Я бы хотел, чтобы one.com/two прошел и показал two.com с использованием пула two, но, похоже, у меня возникли трудности.
Через псевдоним
и try_files
, я ' Мне удалось получить статические ресурсы из файлов two.com, обслуживаемых через. one.com/two/path/to/asset.ext, но запросы PHP, например, one.com/two/index.php
(и запросы к файлам, которые не существуют в двух и попытка отладки путем добавления заголовков в каждый блок местоположения показывает только заголовок, присутствующий в последнем универсальном блоке php.
-
РЕДАКТИРОВАТЬ 2:
Оказывается, что fastcgi_split_path_info
необходимо изменить на также учитывайте префикс каталога.
Итак, я вырезал файл фрагмента и немного изменил его внутри блока местоположения:
location ^~ /two {
alias /data/srv/nginx/two.com/public/;
try_files $uri $uri/ /two/index.php$is_args$args;
location ~* ^\/two.+\.php$ { # have also tried with just \.php$
alias /srv/two.com/public/$1;
fastcgi_split_path_info ^/two(.+\.php)().*$; # the second group is deliberately empty.
try_files $fastcgi_script_name =404;
fastcgi_param PATH_INFO $path_info;
fastcgi_index index.php;
include snippets/fastcgi_params.conf;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/var/run/php/7.1-two.com.sock;
}
}
Похоже, это заставляет блоки местоположения работать, за исключением случаев, когда я прохожу на один уровень глубже, например / two / account
- который снова показывает страницу 404 one.com.
Я сбросил отказ во внешнем местоположении, который останавливает запрос, но удаление отказа во внутреннем местоположении вместо этого не блокирует запрос. По какой-то причине он решает использовать последнее местоположение регулярного выражения в исходном коде.
Итак, я обнаружил проблему и отказался -такое отличное решение.
Согласно документации nginx, существует известная ошибка, когда использует try_files
и псевдоним
в том же контексте (который выиграл не будет исправлено).
В багтрекере nginx есть обсуждение ошибки , включая случаи и то, что на самом деле происходит.
Поэтому мне пришлось в конечном итоге изменить свои config следующим образом:
Во-первых,завершающую косую черту необходимо удалить из строк псевдонима
, поскольку try_files
добавит косую черту к самому себе.
Во-вторых, try_files
в первом блоке необходимо для дважды префикс имени запроса - вместо /two/index.php
он стал /two/two/index.php
(потому что псевдоним обрезает первую часть перед определением следующий блок местоположения).
Наконец, для PHP мне нужно было настроить REQUEST_URI
, чтобы вместо /two/index.php
он проходил как / index .php
.
Я создал отображение переменных в своей основной конфигурации nginx следующим образом:
http {
# ...
map $request_uri $prefixless_request_uri {
"~^/[^/]+(?P<path>.*)$" $path;
}
И затем сослался на него прямо перед тем, как вызвать fastcgi_pass
, чтобы переопределить переданное значение.
fastcgi_param REQUEST_URI $prefixless_request_uri;