Проблема NGINX с Subdir с PHP Framework

У меня есть PHP-фреймворк с такими папками:

/index.php : front controller
/controllers/* : page controllers
/models/* : models
/views/* : views

Я настроил правила NGINX таким образом, что если явный путь к файлу или папке не найден, он перезаписывает запрос в index.php. Я делаю так с этим:

location / {
    try_files $uri $uri/ @php;
}

location @php {
    rewrite ^/(.*)$ /index.php?$1 last;
}

Все хорошо, пока я не хочу повторить этот фреймворк в подкаталог с именем «keys» для отдельного веб-приложения. Теперь происходит следующее: если я вызываю https://example.com/keys/, он вызывает /home/example.com/www/keys/index.php, что правильно, поскольку это передний контроллер подкаталога, а не передний контроллер родительской папки (/home /example.com/www/index.php). Но проблема в том, что если я вызываю /keys/login, он должен отправить этот запрос на фронт-контроллер keys/index.php. Вместо этого он отправляет запрос на /index.php (корневой передний контроллер). Как я могу это исправить, чтобы запросы путей, включающих подкаталог, вызывали соответствующий передний контроллер подкаталога?

Стоит ли изучать 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 и хотите разрабатывать...
0
0
22
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Добавьте еще одно правило перезаписи в свой блок location @php, чтобы оно выглядело так:

location @php {
    rewrite ^/keys/(.*)$ /keys/index.php?$1 last;
    rewrite ^/(.*)$ /index.php?$1 last;
}

Директива last говорит запустить это правило и прекратить дальнейшие перезаписи в этом блоке. Таким образом, вы перехватываете, когда обнаруживаете URL-адреса с начальными путями к папкам /keys/ и отправляете их в соответствующий файл переднего контроллера, но в противном случае отправляете запрос в файл корневого переднего контроллера.

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