Помогите понять mod_rewrite - PullRequest
       14

Помогите понять mod_rewrite

2 голосов
/ 23 июня 2011

Допустим, у меня есть следующая настройка файловой системы на моем веб-сервере:

/www/web/foo/widget.php
...
/www/app/mvc/controllers/WidgetController.php

Мне нужно выяснить, как использовать mod_rewrite для сопоставления запросов страницы (и соответствующих им данных GET / POST) для widget.phpк своему контроллеру WidgetController.php.

Похоже, что mod_rewrite сверхмощный и, следовательно, сложен.Есть ли быстрый и простой способ объяснить мне, как это сделать?Какие файлы мне нужно изменить?Может кто-нибудь показать мне пример правила для этого примера "виджета"?

Спасибо!

1 Ответ

6 голосов
/ 23 июня 2011

Нет ничего быстрого и легкого.

Настройка

Сначала убедитесь, что у вас установлен пакет

Чтобы использовать mod_rewrite, вам нужно загрузить расширение. Обычно это делается путем добавления модуля rewrite.so в глобальную конфигурацию apache2 (/etc/apache2/apache2.conf)

Обычно все инструкции mod_rewrite записываются в определении виртуального хоста. (Скажите: /etc/apache2/site-available/000default)

Использование

Первый шаг

Чтобы включить перезапись для одного сайта, вы должны запросить его с помощью:

RewriteEngine On

Тогда вы можете начать писать правила. Основные правила, которые вам нужно написать, описываются следующей схемой:

Rewrite States

(См. Также: Как работает перезапись URL? )

Чтобы помочь мне понять, как это работает, всегда рассматривайте это со стороны сервера (а не со стороны клиента). Вы получаете URL от клиента. Этот URL имеет определенный формат, который вы определили. (Например, http://blog.com/article/myarticle-about-a-certain-topic). Но Apache не может понять это сам, поэтому мы должны помочь ему. Мы знаем, что контроллер page.php и может искать статью по имени.

Получение информации

Так что теперь мы подделываем regex для извлечения информации из URL. Все регулярные выражения сопоставляются с тем, что следует за вашим доменным именем (здесь: article/myarticle-about-a-certain-topic без первого / - это можно записать, хотя в последней версии переписать)

Здесь нам нужно название статьи: ^article/(.*)$ выполнит работу по сопоставлению URL с article/<something> и захвату <something> в $1. (Что касается символов, я советую вам посмотреть учебник по регулярным выражениям. Здесь ^ - начало строки, невидимая позиция после .com/ и $ конец URL)

Так что теперь нам нужно сообщить apache, что этот URL означает http://myblog.com/page.php?article=myarticle-about-a-certain-topic

Это достигается с помощью RewriteRule

RewriteRule ^article/(.*)$ page.php?article=$1

Ограничение условиями

Чтобы немного углубиться в предварительные темы, вы можете применить это правило, только если название статьи выбирается методом GET. Для этого вы можете включить RewriteCond как

RewriteCond %{REQUEST_METHOD} GET

Он идет ДО RewriteRule в файле, но проверяется ПОСЛЕ этого.

Флаги

Если вы делаете много переадресации / перезаписи, вам нужно понимать flags

Наиболее используемыми являются [L] и [R]. Небольшое объяснение тем:

  • [R] запросить перенаправление, его можно настроить как [R=302], где 302 - это номер состояния перенаправления протокола HTTP. Это заставит клиента сделать новый запрос с переписанным URL. Поэтому он увидит переписанный URL в своей адресной строке.
  • [L] заставляет apache прекратить обработку правил. Имейте в виду, что это означает, что текущий входящий URL-адрес перестанет быть измененным, но переписанный URL-адрес WILL снова пройдет процесс перезаписи. Имейте это в виду, если вы хотите избежать петель.

Заключение

Таким образом, вы получите следующий блок инструкций

RewriteEngine On
RewriteCond %{REQUEST_METHOD} GET
RewriteRule ^article/(.*)$ page.php?article=$1

Смотри также

Вы можете найти дополнительные ресурсы здесь:

...