Я преобразовал большинство моих правил Apache HTTPd mod_rewrite в модуль HttpRewrite nginx (который вызывает PHP-FPM через FastCGI при каждом динамическом запросе). Простые правила, которые определяются жесткими местоположениями, работают нормально:
location = /favicon.ico { rewrite ^(.*)$ /_core/frontend.php?type=ico&file=include__favicon last; }
У меня все еще возникают проблемы с регулярными выражениями, которые анализируются в mod_rewrite следующим образом (обратите внимание, что я принимаю завершающие косые черты в правилах, а также добавляю строку запроса к каждому запросу):
mod_rewrite
# File handler
RewriteRule ^([a-z0-9-_,+=]+)\.([a-z]+)$ _core/frontend.php?type=$2&file=$1 [QSA,L]
# Page handler
RewriteRule ^([a-z0-9-_,+=]+)$ _core/frontend.php?route=$1 [QSA,L]
RewriteRule ^([a-z0-9-_,+=]+)\/$ _core/frontend.php?route=$1 [QSA,L]
RewriteRule ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)$ _core/frontend.php?route=$1/$2 [QSA,L]
RewriteRule ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)\/$ _core/frontend.php?route=$1/$2 [QSA,L]
RewriteRule ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)$ _core/frontend.php?route=$1/$2/$3 [QSA,L]
RewriteRule ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)\/$ _core/frontend.php?route=$1/$2/$3 [QSA,L]
Я придумал следующую конфигурацию сервера для сайта, но после синтаксического анализа запроса я столкнулся с несогласованными правилами (например, GET /user/auth
):
попытка перезаписи nginx
location / {
# File handler
rewrite ^([a-z0-9-_,+=]+)\.([a-z]+)?(.*)$ /_core/frontend.php?type=$2&file=$1&$3 break;
# Page handler
rewrite ^([a-z0-9-_,+=]+)(\/*)?(.*)$ /_core/frontend.php?route=$1&$2 break;
rewrite ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)(\/*)?(.*)$ /_core/frontend.php?route=$1/$2&$3 break;
rewrite ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)(\/*)?(.*)$ /_core/frontend.php?route=$1/$2/$3&$4 break;
}
Что вы посоветуете для работы с моим обработчиком файлов (это просто filename.ext
) и моим обработчиком страниц (который представляет собой уникальный запрос маршрута с до 3-х свойств, определяемых косой чертой)?
Поскольку я еще не получил ответа от этого, я также не уверен, переопределит ли это мой синтаксический анализатор PHP, который определен с помощью location ~ \.php {}
, который включен перед этими правилами перезаписи.
Бонусные баллы, если я могу решить проблемы синтаксического анализа без необходимости использовать новое правило для каждого количества свойств маршрута.