Я перемещаю настраиваемое приложение mvc php в рабочую среду на ubuntu и nginx и борюсь с структурой перезаписи приложения. Цель состоит в том, чтобы взять URL-адреса, ориентированные на контроллер, например:
domain.com/index.php?controller=store&action=search&category=3
, и превратить их в визуально приятные URL-адреса, подобные этому
domain.com/store/search/category/3
. Как и в других фреймворках, приложение выполняет все запросы через файл index.php, который ищет соответствующий контроллер для обработки запрос. Чтобы справиться с этим, я добавил начальное правило перезаписи, например:
location / {
try_files $uri $uri/ @rewrite;
}
В модуле перезаписи, который у меня есть:
location @rewrite {
rewrite ^/(.*)$ /index.php?op=$1 last; }
Приведенный выше код - это начало, которое приближает меня к доступу к нашим контроллерам через более чистые URL-адреса, но я не приблизился к более широкой стратегии, чтобы справиться с этим. Любая помощь будет принята с благодарностью, я просмотрел большую часть Интернета, и ресурсы, с которыми я сталкиваюсь, кажутся слишком расплывчатыми, слишком конкретными или устаревшими.
В документации для rewrite
директивы есть пример, который помогает решить вашу проблему:
Синтаксис:
rewrite regex replace [flag];
Но если эти директивы помещены в папку
/ download /
,последний флаг
следует заменить наbreak
, иначе nginx сделает 10 циклов и вернет ошибку 500:location / download / { перезаписать ^ (/ download /.*)/ media /(.*)\..*$ $ 1 / mp3 / $ 2.mp3 break; перезаписать ^ (/ download /.*)/ audio /(.*)\..*$ $ 1 / mp3 / $ 2.ra break; возврат 403; }
Нам нужно изменить /index.php?controller=store&action=search&category=3
в правильную форму для строки замены
, получить переменные из / store / search / category / 3
, превратив его в регулярное выражение
и не забудьте использовать break
внутри location
.
Если все четыре части являются переменными:
rewrite ^ / (. *) / (. *) / (. *) / (. *) $ /Index.php?controller=$1&action=$2&$3 = Перерыв в 4 доллара;
Если категория
является фиксированной частью URL:
rewrite ^ / (. *) / (. *) / Category /(.*)$ /index.php?controller= $ 1 & действие = $ 2 & категория = перерыв 3 $;