Перезапись URL веб-сервера - PullRequest
0 голосов
/ 18 ноября 2011

Я хотел бы сделать конфигурацию перезаписи URL-адреса для следующего:

  1. Разрешение URL моего веб-сайта отображаться как site.com/category/item (перенаправлено на index.php? C = $ 1 & i = $ 2)
  2. Разрешение на включение файлов из каталогов, таких как config (site.com/config/conf.txt)
  3. Перенаправьте URL-адрес, например site.com/admin/category/item, в admin.php? C = $ 1 & i = $ 2

Пока мне удалось настроить эти 2 правила:

RewriteRule ^([a-z]+)/([^\.^/]+)$ index.php?c=$1&i=$2 [L]
RewriteRule ^[^/]+/([^/]+)$ $1

Они работают для первых 2 пунктов, но мне не удается найти третий, который будет работать с существующими правилами ...

В данный момент я использую Apache, но я также с нетерпением жду возможности использования NGinx. Было бы замечательно, если бы правила были совместимы.

У вас есть какой-нибудь совет?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2011

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

Вот правила, которые я использовал:

RewriteCond %{REQUEST_URI} !/config/([^\.]+/)*[a-z\.^/]+$
RewriteRule ^([a-z]+)/([^\.^/]+)$ index.php?c=$1&i=$2 [L]

RewriteCond %{REQUEST_URI} !/config/([^\.]+/)*[a-z\.^/]+$
RewriteRule ^admin/([a-z]+)/([^\.^/]+)$ admin.php?c=$1&i=$2 [L]

RewriteCond %{REQUEST_URI} /config/([^\.]+/)*[a-z\.^/]+$
RewriteRule /config/(([^\.]+/)*[a-z\.^/]+)$ config/$1 [L]

Я начал с проверки URL-адреса с конца, а не с начала, поскольку эти правила затем можно применить в подкаталоге root.Я разрешил вызывать подкаталоги в каталоге config.Последнее правило является реентерабельным, но избегайте другого переписывания, если правила применяются в корневом каталоге.Если нет, выражение не совпадает, и правило применяется для создания выходных данных, идентичных входным данным.

В общем случае невозможно избежать повторного применения сервером правил перенаправления к ранееперенаправленный URI.Документация говорит о том, что для этого есть флаг [END], но я не смог успешно применить это на практике ... Таким образом, для меня все правила htaccess должны быть реентерабельными.

0 голосов
/ 18 ноября 2011

Вот ответ:

RewriteCond %{REQUEST_URI} !config
RewriteRule ^([a-z]+)/([^\.^/]+)$ index.php?c=$1&i=$2 [L]

RewriteCond %{REQUEST_URI} !config
RewriteRule ^admin/([a-z]+)/([^\.^/]+)$ admin.php?c=$1&i=$2 [L]

Перевод: если URI не начинается с /config/, тогда (только тогда) попытайтесь применить другой rewriterule, таким образом "позволяя включать файлы из каталоговкак config (site.com/config/conf.txt) " и все еще применяя правила к другим URL-адресам.


Пожалуйста, попробуйте использовать директиву RewriteLog: это помогаетвам отследить такие проблемы:

# Trace:
# (!) file gets big quickly, remove in prod environments:
RewriteLog "/web/logs/mywebsite.rewrite.log"
RewriteLogLevel 9
RewriteEngine On

Подскажите, работает ли он.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...