Корневая директива Nginx внутри блока местоположения не работает, как я ожидаю

У меня большая головная боль при настройке Nginx для работы внутри блока местоположения.

Я разрабатываю веб-приложение с Laravel, и оно находится по адресу /srv/http/zenith. В Laravel индекс находится внутри папки public, поэтому я пытаюсь добраться до него, используя следующую конфигурацию:

location /zenith/ {
  root /srv/http/zenith/public;
  try_files $uri $uri/ /index.php?$query_string;

  location ~ \.php$ {
    fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }
}

Но каждый раз выдает ошибку 404. Как я прочитал в документации Nginx, Nginx не удаляет путь из URI, поэтому даже внутри блока /zenith/ все URI по-прежнему начинаются с /zenith/. Таким образом, example.com/zenith указывает на /srv/http/zenith/public/zenith, когда я хочу /srv/http/zenith/public.

Как исправить эту ошибку? Я ожидал, что Nginx автоматически удалит эту ненужную часть, но, похоже, это не так.


person ranisalt    schedule 02.02.2014    source источник


Ответы (1)


Вам необходимо понимать разницу между корнем и псевдонимом. Корень сопоставляет URI / с упомянутым каталогом и ожидает, что все части URI после него будут соответствовать дереву на диске. Псевдоним сопоставляет местоположение блока, частью которого он является, с упомянутым каталогом и ожидает, что все части URI после этого местоположения будут соответствовать дереву на диске. Поскольку корень внутри блока местоположения по-прежнему отображает URI /, часть после / должна существовать на диске, чтобы все работало. В общем случае вы будете использовать root для корня документа и псевдоним для блоков местоположения.

person Community    schedule 03.02.2014
comment
Это устраняет часть проблемы, но теперь я получаю 403 ошибки. Когда я прочитал журналы, я нашел это: 2014/02/03 13:19:50 [error] 14310#0: *24 FastCGI sent in stderr: "Unable to open primary script: /srv/http/zenith/public/zenith/info.php (No such file or directory)". Так что он все еще добавляет /zenith/ к имени скрипта:/ - person ranisalt; 03.02.2014
comment
Можете ли вы опубликовать весь серверный блок? - person Melvyn; 03.02.2014
comment
Более 3 лет спустя: Итак, вы исправили это? - person Parziphal; 10.03.2017
comment
Извините, что не уследил. Ошибка в случае с ОП заключается в том, что /zenith/ является частью $fastcgi_script_name, потому что он так сказал. fastcgi_split_path_info не отсекает часть локации, в которой он используется. - person Melvyn; 13.03.2017