У меня есть 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 (корневой передний контроллер). Как я могу это исправить, чтобы запросы путей, включающих подкаталог, вызывали соответствующий передний контроллер подкаталога?






Добавьте еще одно правило перезаписи в свой блок location @php, чтобы оно выглядело так:
location @php {
rewrite ^/keys/(.*)$ /keys/index.php?$1 last;
rewrite ^/(.*)$ /index.php?$1 last;
}
Директива last говорит запустить это правило и прекратить дальнейшие перезаписи в этом блоке. Таким образом, вы перехватываете, когда обнаруживаете URL-адреса с начальными путями к папкам /keys/ и отправляете их в соответствующий файл переднего контроллера, но в противном случае отправляете запрос в файл корневого переднего контроллера.