Сначала некоторые подробности о моей настройке:
У меня следующая конфигурация за работой Nginx:
upstream fastcgi_backend {
server localhost:9000;
keepalive 30;
}
server {
listen 80;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
location ~ ^/(api|api-debug)/ {
root /app/webroot;
index index.php;
try_files $uri /api/index.php$is_args$args;
location ~ \.php$ {
fastcgi_pass fastcgi_backend;
fastcgi_split_path_info ^(?:/api/)(.+\.php)(.*)$;
fastcgi_param SCRIPT_FILENAME /app/webroot/$fastcgi_script_name;
include fastcgi_params;
}
}
}
}
Я просто хочу сделать его более простым и эффективным, потому что, как я вижу сейчас, это беспорядок. Я пытался например настроить
try_files $uri /api/index.php$is_args$args;
к
try_files $uri /api/webroot/index.php$is_args$args;
и это не удалось ... Единственная причина, по которой это работает, состоит в том, что /api/index.php включает /api/webroot/index.php, но я считаю, что это неэффективно.
Отладка конфигурации nginx показалась мне сложной, потому что ее нелегко протестировать.
Заранее большое спасибо за вашу помощь!
Привет, Ричард, Спасибо за ответ. Оба файла существуют: /app/index.php и /app/webroot/index.php, где /app/index.php - это просто оператор включения для /app/webroot/index.php. Обратите внимание, что файлы расположены на диске в / app / xxx и НЕТ в / api / xxx. / Api / - это просто URL-адрес.
Конечная цель - заставить это работать: Документы CakePHP Со следующим: - Правила перезаписи применяются только к URL-адресам, начинающимся с / api - Файлы недоступны на хосте сервера nginx (try_files завершится ошибкой, я также не вижу при любой необходимости просто передайте все запросы / api на localhost: 9000 / app / webroot / index.php в соответствующей форме перезаписи). Надеюсь, я внес здесь некоторые пояснения. Спасибо за вашу помощь! @RichardSmith
Хорошо, я не заметил, как fastcgi_split_path_info удаляет префикс /api/ из URI.






Самым простым решением было бы зашифровать SCRIPT_FILENAME со значением /app/webroot/index.php и полностью удалить один из ваших блоков location.
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location ~ ^/(api|api-debug)/ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /app/webroot/index.php;
fastcgi_pass fastcgi_backend;
}
В качестве альтернативы, чтобы сохранить гибкость указания URI с расширением .php, вы можете упростить конфигурацию с помощью:
location / {
root /usr/share/nginx/html;
index index.html index.htm;
rewrite ^/(api|api-debug)/ /index.php last;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /app/webroot$uri;
fastcgi_pass fastcgi_backend;
}
Спасибо, Ричард, завтра попробую и доложу!
Привет, Ричард, вызовы / api завершаются правильно в PHP-FPM, но у меня есть некоторые проблемы с перезаписью, я вставил различие print_r ($ _ SERVER); здесь. Результаты вашей конфигурации слева, моя рабочая конфигурация справа. Единственная проблема с моей заключается в том, что я не знаю, как это работает, и мне это не нравится ... Должен ли я заменить все переменные на fastcgi_param, подключив их? Или есть более чистое решение? Спасибо!
В верхнем примере URI не перезаписывается, поэтому все параметры FastCGI получены из исходного запроса. Кроме того, root не входит в область действия, поэтому содержит значение nginx по умолчанию. Все эти параметры определены в файле fastcgi_params, поэтому вы можете заменить их тем, что нужно вашему приложению, или использовать нижний пример.
Дорогой Ричард, после нескольких часов отладки я нашел именно то, что нужно приложению. Раньше я не обращал на это внимания, потому что использовал apache с готовыми файлами .htaccess, поставляемыми с фреймворком. Получается, что / api / some / path / here? Sample = querystring должен иметь следующий вид: /app/webroot/index.php/api/some/path/here?sample=querystring, и никакие другие .php файлы будут обрабатываться когда-либо, поэтому нет необходимости во втором блоке "location ~ \ .php $" (я полагаю?). Не могли бы вы помочь мне сделать это как можно более чистым и эффективным? Большое спасибо за вашу щедрую помощь!
Извините, я забыл, что это также должно работать и для / api-debug ... Еще раз спасибо!
Я также был бы признателен за некоторые идеи или фразы, которые можно найти, если у вас есть @RichardSmith! Спасибо
Согласно вашему вопросу,
index.phpнаходится по адресу/app/webroot/index.php. Но согласно вашему конфигурационному файлу за работой, URI/api/index.phpбудет преобразован в путь к/app/webroot/api/index.php. Добавлениеwebrootв URI не имеет смысла, чего именно вы пытаетесь достичь?