Nginx + PHP-FPM перенаправление на статический файл PHP

Сначала некоторые подробности о моей настройке:

  • Я обслуживаю статическое веб-приложение (HTML + JS) из веб-корневого каталога Nginx по умолчанию
  • У меня есть сервер PHP-FPM, работающий на localhost: 9000
  • Конечный файл должен быть /api/webroot/index.php для FPM (всегда, не нужно пытаться_файлы и т. д.)
  • Мне нужно перенаправить все вызовы / api и / api-debug, чтобы прибыть на localhost: 9000, и /app/webroot/index.php должен обрабатывать все эти запросы.

У меня следующая конфигурация за работой 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 показалась мне сложной, потому что ее нелегко протестировать.

Заранее большое спасибо за вашу помощь!

Согласно вашему вопросу, index.php находится по адресу /app/webroot/index.php. Но согласно вашему конфигурационному файлу за работой, URI /api/index.php будет преобразован в путь к /app/webroot/api/index.php. Добавление webroot в URI не имеет смысла, чего именно вы пытаетесь достичь?

Richard Smith 20.05.2018 14:12

Привет, Ричард, Спасибо за ответ. Оба файла существуют: /app/index.php и /app/webroot/index.php, где /app/index.php - это просто оператор включения для /app/webroot/index.php. Обратите внимание, что файлы расположены на диске в / app / xxx и НЕТ в / api / xxx. / Api / - это просто URL-адрес.

Mark Johann 20.05.2018 17:29

Конечная цель - заставить это работать: Документы CakePHP Со следующим: - Правила перезаписи применяются только к URL-адресам, начинающимся с / api - Файлы недоступны на хосте сервера nginx (try_files завершится ошибкой, я также не вижу при любой необходимости просто передайте все запросы / api на localhost: 9000 / app / webroot / index.php в соответствующей форме перезаписи). Надеюсь, я внес здесь некоторые пояснения. Спасибо за вашу помощь! @RichardSmith

Mark Johann 20.05.2018 17:32

Хорошо, я не заметил, как fastcgi_split_path_info удаляет префикс /api/ из URI.

Richard Smith 20.05.2018 17:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
1 452
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Самым простым решением было бы зашифровать 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;
}

Спасибо, Ричард, завтра попробую и доложу!

Mark Johann 20.05.2018 19:40

Привет, Ричард, вызовы / api завершаются правильно в PHP-FPM, но у меня есть некоторые проблемы с перезаписью, я вставил различие print_r ($ _ SERVER); здесь. Результаты вашей конфигурации слева, моя рабочая конфигурация справа. Единственная проблема с моей заключается в том, что я не знаю, как это работает, и мне это не нравится ... Должен ли я заменить все переменные на fastcgi_param, подключив их? Или есть более чистое решение? Спасибо!

Mark Johann 22.05.2018 16:13

В верхнем примере URI не перезаписывается, поэтому все параметры FastCGI получены из исходного запроса. Кроме того, root не входит в область действия, поэтому содержит значение nginx по умолчанию. Все эти параметры определены в файле fastcgi_params, поэтому вы можете заменить их тем, что нужно вашему приложению, или использовать нижний пример.

Richard Smith 22.05.2018 16:34

Дорогой Ричард, после нескольких часов отладки я нашел именно то, что нужно приложению. Раньше я не обращал на это внимания, потому что использовал apache с готовыми файлами .htaccess, поставляемыми с фреймворком. Получается, что / api / some / path / here? Sample = querystring должен иметь следующий вид: /app/webroot/index.php/api/some/path/here?sample=querystring‌, и никакие другие .php файлы будут обрабатываться когда-либо, поэтому нет необходимости во втором блоке "location ~ \ .php $" (я полагаю?). Не могли бы вы помочь мне сделать это как можно более чистым и эффективным? Большое спасибо за вашу щедрую помощь!

Mark Johann 23.05.2018 23:09

Извините, я забыл, что это также должно работать и для / api-debug ... Еще раз спасибо!

Mark Johann 23.05.2018 23:10

Я также был бы признателен за некоторые идеи или фразы, которые можно найти, если у вас есть @RichardSmith! Спасибо

Mark Johann 25.05.2018 21:29

Другие вопросы по теме