mod_rewrite в правила перезаписи nginx

Я преобразовал большинство моих правил 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 {}, который включен перед этими правилами перезаписи.

Бонусные баллы, если я могу решить проблемы синтаксического анализа без необходимости использовать новое правило для каждого количества свойств маршрута.


person abestic9    schedule 31.07.2012    source источник


Ответы (1)


В итоге я написал следующие правила:

Обработчик файлов

location ~ ^/([a-zA-Z0-9-_]*)\.([a-zA-Z0-9]*)$ { include /web/_config/php.conf; rewrite ^/([a-zA-Z0-9-_]*)\.([a-zA-Z0-9]*)$ /_core/frontend.php?type=$2&file=$1 last; }

Обработчик файла берет имя и расширение и записывает их в type = {ext} & file = {name}.

Обработчик страницы

location ~ ^/([a-z0-9-_]*)$ { include /web/_config/php.conf; rewrite ^/([a-z0-9-_]*)$ /_core/frontend.php?route=$1 last; }
location ~ ^/([a-z0-9-_]*)/?([a-z0-9-_]*)$ { include /web/_config/php.conf; rewrite ^/([a-z0-9-_]*)/?([a-z0-9-_]*)$ /_core/frontend.php?route=$1/$2 last; }
location ~ ^/([a-z0-9-_]*)/?([a-z0-9-_]*)/?([a-z0-9-_]*)$ { include /web/_config/php.conf; rewrite ^/([a-z0-9-_]*)/?([a-z0-9-_]*)/?([a-z0-9-_]*)$ /_core/frontend.php?route=$1/$2/$3 last; }

Обработчик страницы (который в данном случае обрабатывает до 3 "каталогов") захватывает строку между каждым разделителем (/), выполняет проверку регулярного выражения и записывает ее как строку запроса.

Основное различие между этой и моей исходной конфигурацией заключалось в том, что каждая запись имеет свой собственный обработчик местоположения, с правилом last, которое обрабатывает ее при первом совпадении, поэтому производительность должна быть немного лучше.

Я также обнаружил, что nginx по умолчанию добавляет строки запроса, поэтому регулярное выражение не требуется, что является еще одним улучшением производительности.

Обратите внимание, что /web/_config/php.conf - это просто конфигурация прохода FastCGI, и конфигурация, поставляемая с nginx (обычно /etc/nginx/fastcgi.conf), должна работать нормально. Обратите внимание: если вы работаете исключительно с PHP, вам не нужно определять это в каждом правиле, просто добавьте к ним include.

Надеюсь это поможет.

person abestic9    schedule 13.11.2012