Введение в использование mod_rewrite. Как на самом деле работает mod_rewrite. Пособие для продолжающих

andew

2015-02-13T11:59:58+00:00

2018-03-02T04:50:41+00:00

34141

В статье я привожу описание логики работы правилаRewriteRule и синтаксис некоторых директив модуля mod_rewrite сервера Apache. Также я выделил и обобщил несколько выводов-постулатов, которые, как мне кажется, нужно обязательно знать и понимать при использовании этого модуля. Надеюсь, что все это позволит вам, так же, как и мне ранее, разобраться с работой этого модуля, предоставляющего мощный функционал для выполнения различных преобразований над URL .

Не забывайте в регулярном выражении экранировать служебные символы. Иногда забывают экранировать точку, когда она должна выступать именно как точка, а не как принято в регулярном выражении - как любой символ.

Также не забывайте оборачивать весь блок правил для mod_rewrite в тег:

Не пишите излишне много директив для mod_rewrite , пишите только те правила преобразования, которые вам действительно необходимы. Особенно нужно быть аккуратным с внешними ридиректами - это такие ридиректы, которые выполняются путем отправки клиенту серверного заголовка с кодом НЕ 200 (отдача полноценной страницы), а с другим кодом (чаше всего 301 и 302 ) и которые приводят к перенаправлению в браузере клиента на другой URL т.е. к совершению нового запроса на клиенте. Поэтому любой внешний ридирект всегда приводит к потере времени в обработки запроса, т.к. нужно отправить клиенту ответ, он должен его прочитать, и повторить запрос уже по новому URL. Это затратная по времени процедура. Поэтому ридиректы должны быть только если они действительно вам необходимы.

Учитывайте, что браузеры могут кешировать редиректы, при этом Ctrl+F5 или Ctrl+R не снимает проблему. Поэтому отключайте кеширование в браузере при тестировании ваших правил rewrite модуля web сервера Apache .

Для поиска ошибок работы ваших правил читайте логи Apache .

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

В этой статье я описал только две директивы и главные на мой взгляд понятия. Однако, как сами понимаете, mod_rewrite предоставляет много других директив и функционала.

Htaccess. правило RewriteRule: просто, понятно, с примерами и объяснениями
Мы, как веб программисты, часто сталкиваемся с файлом .htaccess и в частности с его модулем MOD_REWRITE и синтаксисом RewriteRule . И по началу трудно разобраться и понять принцип его работы, правила по которым он работает и механизм преобразования динамических ссылок в статические и наоборот. В этой статье я постараюсь максимально просто, максимально доступно, с объяснениями и примерами растолковать так, что бы у Вас не осталось каких либо вопросов.
За преобразование динамических ссылок в статические отвечает модуль mod_rewrite с синтаксисом RewriteRule , принцип работы и правило преобразования, которого я и буду объяснять.
Для примера возьмем динамическую ссылку, которую нам надо преобразовать:

В этой ссылке мы включили максимально возможное количество передаваемых параметров на нашем сайте.
То есть, в каталоге выбрали авто BMW, модель X5, состояние – новое, страница 5.

В файле .htaccess , который мы разместим в корневой папке каталога catalog/ записываем (файл .htaccess действует только на каталог где он расположен и на его дочерние каталоги):
RewriteEngine on (включаем процесс преобразования ссылок)
RewriteRule ^(+)/([^/]+)/(.*)/(+).html$ index.php?auto=$1&model=$2&state=$3&page=$4 [L]

Давайте подробней разберемся, что здесь написано:
^ Начало строки;
(+) Скобки создают переменную, которую подставляем в динамическую ссылку $1. То есть
Переменная $1 = ([ A- Za- z0-9-]+)
Переменная $2 = ([^/]+)
Переменная $3 = (.*)
Переменная $4 = (+)
В скобках [ A- Za- z0-9-] класс допустимых символов. В данном случае допустимыми символами являются A B C D…Z a b c…z 0 1 2 3…9 – Если мы хотим добавить символы, например, ? ; : то получим следующее то есть просто дописали их.
+ означает что мы добавляем еще один символ для подстановки.
Выражение ([^/]+) означает любой символ кроме(^ означает кроме) слеша назад. + означает добавить еще символ.
Выражение (.*) Точка означает любой единичный символ, * означает как и плюс – добавить еще символ.
Выражение (+) думаю, тут понятно.
.html – означает что статическая строка оканчивается на.html
Слеши / означают слеши в статической ссылке.

Следует отметить, что данный мод преобразовывает ссылки не с динамической в статические ссылки а НАОБОРОТ! То есть, на сайте мы пишем статические ссылки, а мод рерайт преобразовывает статическую ссылку с сайта на динамическую. То есть представленную выше ссылку мы должны записать на сайте в виде статической:
site.ru/catalog/ BMW/X5/NEW/5.html
А модуль RewriteRule эту ссылку преобразовывает в динамическую по правилу записанному в .htaccess и выдает сайту:

На выходе получается ссылка: site.ru/catalog/index.php?auto=BMW&model=X5&state=NEW&page=5
Которая и понятно нашим php скриптам и страницам сайта.
Так же к выше изложенному правилу преобразования следует добавить правила для ссылки без переменной номера страницы page, а так же возможных вариантов с отсутствием переменных.
RewriteRule ^(+)/([^/]+)/(.*).html$ index.php?auto=$1&model=$2&state=$3 [L]
RewriteRule ^(+)/([^/]+).html$ index.php?auto=$1&model=$2 [L]
RewriteRule ^(+).html$ index.php?auto=$1 [L]
Ниже приведу возможные обозначения и символы используемые в модуле MOD_REWRITE:
. Любой одиночный символ . Если нам в круглых скобках нужна именно точка а не любой одиночный символ ее нужно экранировать. Обратный слеш экранирует какой либо символ () ? > и т.п. и передает его истинное значение.
Класс симвлолв : Один из символов например {2,5}- фигурные скобки означают диапозон количества символов, в данном случае допускается от 2 до 5 символов.
[^chars] Класс симвлолв : Ни один из символов. [^fg57] – символы f g 5 7 запрещены.
text1|text2 Альтернатива: text1 или text2. например означает или a или b или c
Кванторы (символы для обозначения количественных отношений):
? 0 или 1 из предшествующего текста Означает либо есть символ или какое-то значение символов или их может не быть.
* 0 или N из предшествующего текста (N > 0)
+ 1 или N из предшествующего текста (N > 1)
макрос "$1 " обозначает ту часть исходного пути, которая расположена внутри первой пары скобок "RewriteRule ^(.*)....." , $2 – внутри второй пары и так далее.
Маркеры:
^ Маркер начала строки
$ Маркер конца строки

Пример RewriteRule с пояснениями:
Допустим, у нас на сайте есть статьи, которые имеют динамические страницы:
http://www.site.ru/articles?id=(id статьи)
Сделаем, чтобы ссылка на наши статьи была более красива, например:
http://www.site.ru/nazvanie-stati/ или
http://www.site.ru/nazvanie-stati.html
Для этого, в нашей MySQL таблице, добавляем дополнительную строку, в которой будем хранить уникальное название статьи латинскими буквами без пробелов, слешов и специальных символов, недопустимых в ссылках. Например: Moya-pervaya-statya ну и по такому принципу. Назавем строку в нашей таблице, например eng_name_stati
Динамическая ссылка теперь будет иметь вид:
http://www.site.ru/articles?eng_name_stati=(Moya-pervaya-statya и т.д.)
Главный момент, который нужно понять, файл .htaccess , как я говорил выше, не преобразует динамические ссылки в статические, а наоборот, статические преобразовывает в динамические.
Правило преобразования RewriteRule будет иметь вид:
RewriteRule ^(.*)/$ articles?eng_name_stati=$1 [L] для вида статической ссылки: http://www.site.ru/nazvanie-stati/ или
RewriteRule ^(.*).html$ articles?eng_name_stati=$1 [L] для вида
Теперь, когда мы введем ссылку http://www.site.ru/nazvanie-stati.html в браузере, мы попадем на нашу статью http://www.site.ru/articles?eng_name_stati=nazvanie-stati и эти обе ссылки будут рабочими. На нашем сайте мы просто ставим ссылки в статическом виде для поисковых систем. И когда люди заходят по статической ссылке, наш файл .htaccess преобразовывает ее в динамическую, понятную для нашего сайта и видную только ему.

Дополнение:

Бывает так, нужно сначала проверить, не является ли это ссылка на существующий файл на нашем сервере, например /catalog/webmaster/index.html может оказаться существующим файлом, но если эта ссылка попадет под соответствующее правило RewriteRule она согласно этому правилу преобразуется. Поэтому, если нам сначала нужно проверить, не является ли этот файл или директория прямая, нужно пред правилом RewriteRule написать условие если :

Если нет такой папки
Если нет такого файла
Выполнить преобразование

Выглядеть это будет так:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)/([^/]+).html$ index.php?catalog=$1&webmaster=$2&file=$3 [L]

Где, RewriteCond – условие если , %{REQUEST_FILENAME} – полный системный путь к запрашиваемому файлу или директории, Восклицательный знак ! означает отрицание не , -d – дериктория, -f – файл.

Теперь, прежде чем применить правило RewriteRule, будет проверено условие RewriteCond

Почему Вы еще не прокомментировали?
Оставьте свой

Для перенаправления, настройки чпу на веб сайтах использующих и , и вставки ключевых слов в url`ы статей, все директивы прописанные в данной статье прописываются в файле .htaccess который обычно находится в корне вашего сайта, хотя в некоторых cms он есть практически в каждой в папке но это уже совсем другая история….

Ниже приведены 5 примеров использования данного модуля:

1) Переделываем «product.php?id=12» в «product-12.html»

Это простое перенаправление, в котором расширение.php спрятано из адресной строки браузера и динамический УРЛ (с знаком вопроса «?») преобразован в статический адрес

RewriteEngine on
RewriteRule ^product-(+)\.html$ product.php?id=$1

2) Переделываем «product.php?id=12» в «product/ipod-nano/12.html»

Эксперты SEO всегда предлагают показывать главное ключевое слово в УРЛе. В пример Вы можете видеть название продукта в УРЛе.

RewriteEngine on
RewriteRule ^product/(+)/(+)\.html$ product.php?id=$2

3) Перенаправление адресов без www URL на адреса с www — редирект

Если Вы введете yahoo.com в браузере, Вас перенаправит на www.yahoo.com. Для проделывания такой же операции на Вашем сайте добавьте следующий код в файл.htaccess:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^optimaxwebsolutions\.com$
RewriteRule (.*) http://www.optimaxwebsolutions.com/$1

УРЛ сайта, конечно же, поменяйте на свой. Для чего делать такой редирект? Чтобы избежать дублирования сайта поисковиками с www и без www.

4) Переделываем «yoursite.com/user.php?username=xyz» в «yoursite.com/xyz»

В файл.htaccess добавляем следующие строки:

RewriteEngine On
RewriteRule ^(+)$ user.php?username=$1
RewriteRule ^(+)/$ user.php?username=$1

5) Перенаправление домена на новый поддомен или папку.

Допустим, Вы сделали редизайн на сайте и обновленный сайт находится в папке “new” в корне сайта. То есть новый сайт доступен по адресу “test.com/new”. Перенос файлов из одного места в другое может быть довольно трудоемким процесом, так что просто добавьте следующие строки в файл.htaccess и разместите его в корневой папке:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^test\.com$ RewriteCond %{HTTP_HOST} ^www\.test\.com$
RewriteCond %{REQUEST_URI} !^/new/
RewriteRule (.*) /new/$1

Теперь при обращение к «www.test.com» все файлы будут браться из “test.com/new”

mod_rewrite: статический ЧПУ-адрес с одной переменной

Итак, в этой статье я говорил, что сайты на PHP и MySQL имеют адреса следующего формата:

Как правило, такие адреса называют динамическими. Вот мы сейчас и займёмся преобразованием динамических адресов в ЧПУ.

Допустим, нужно преобразовать из lis.php?id=3 в bols3.hi . Регулярное выражение будет иметь следующий формат:

RewriteRule ^НАЗВАНИЕ СТРАНИЦЫ(+)\.РАСШИРЕНИЕ$ ИМЯ НАСТОЯЩЕГО АДРЕСА.php?ПЕРЕМЕННАЯ=$НУМЕРАЦИЯ

То есть в нашем случае получаем следующее:

RewriteRule ^bols(+)\.hi$ lis.php?id=$1

Теперь вместо адреса lis.php?id=90 (где 90 — id) мы можем спокойно обращаться к bols90.hi .

mod_rewrite: статический ЧПУ-адрес с множеством переменных

Рассмотрим такую ситуацию, когда нужно преобразовать адрес с множеством переменных. Например, из lis.php?id=345&cat=3 в bols345-3.hi . Ситуация похожая, но сейчас используется две GET-переменные. В качестве разделителя используется тире. Получаем следующее выражение:

RewriteRule ^bols(+)-(+)\.hi$ lis.php?id=$1&cat=$2

Графически сам принцип преобразования будет выглядить следующим образом:

mod_rewrite: архивный ЧПУ-адрес

Многие архивы на сайте имеют адрес archive.php?year=2003&month=10 . Мы же преобразуем его в archive/2003/10/ . Получаем следующую строку:

RewriteRule ^archive/(+)/(+)\$ archive.php?year=$1&month=$2

mod_rewrite: ЧПУ-адрес для тегов

Сейчас теги присутствуют почти на каждом блоге и сайте. Попробуем изменить адрес для тега winter — posts.php?tag=winter в posts/tags/winter/ . Имеем следующее выражение:

RewriteRule ^posts/tags/(+)\$ posts.php?tag=$1

Кстати, для индексации страниц с динамическими адресами поисковые системы применяют отдельный алгоритм. Я не знаю чем он отличает от обычного, но ЧПУ-преобразования , опять же, помогают указать роботу, что нужно индексировать наш адрес, как обычную статическую страницу.

Htaccess - это дополнительный конфигурационный файл Apache, который позволяет настраивать работу веб-сервера для каждой отдельной директории, не влияя на глобальные настройки Apache. Локальная аналогия httpd.conf . Обычно он отвечает за редиректы и управление доступом к директориям.

Название начинается с точки. Можно сказать, это файл без названия с расширением htaccess.

Настройки.htaccess действуют на каталог, в котором он расположен, и на все дочерние каталоги. Создайте файл и поместите в нужную вам директорию. Например, в корень проекта.

Теперь нужно его наполнить. Посмотрим, что вообще умеет.htaccess, но для начала изучим пример простейшего редиректа.

mod_rewrite и редиректы

Убедитесь, что в конфигурационном файле Apache httpd.conf активирован mod_rewrite . То есть, раскомментирована соответствующая строка:

LoadModule rewrite_module modules/mod_rewrite.so

Или, если не хотите открывать в текстовом редакторе файл, можно воспользоваться командой в терминале:

Sudo a2enmod rewrite

mod_rewrite - это модуль Apache, предназначенный для преобразования URL-ов. Рассмотрим на примере, как он работает. Допустим, пользователь вводит следующий адрес:

C помощью mod_rewrite можно отправить содержание с другого URL, например такого:

Http://www.example.com/public/src/view/page.html

Зачем это нам? Легко догадаться, что писать полный путь до страницы долго и просто неудобно. Посетителям сайта не нужно думать о внутренней структуре сайта - им важно максимально быстро попасть на искомую страницу.

В адресной строке пользователь будет всё также видеть введенное им:

Http://www.example.com/page.html

Это пример самого простого редиректа.

Сразу к практике

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

Php_value short_open_tag 1 php_value upload_max_filesize 10M php_value post_max_size 10M RewriteEngine On RewriteBase / RewriteRule ^(application|modules|system) - RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule .* index.php/$0

  • php_value установка строковых и числовых значений
  • php_flag устанавливает логические значения (да/нет)

Общий синтаксис директив

Php_value/php_flag имя_директивы_php flag/value

Директива short_open_tag разрешает использование короткого синтаксиса для оформления PHP-кода:

Php_value short_open_tag 1

upload_max_filesize определяет максимальный размер загружаемого файла.

Php_value upload_max_filesize 10M

А post_max_size устанавливает максимально допустимый размер данных, отправляемых методом POST.

Php_value post_max_size 10M

RewriteEngine

Включает/выключает механизм mod_rewrite .

RewriteEngine On

RewriteRule

RewriteRule просто преобразовывает строку в соответствии с регулярными выражениями.

Синтаксис: RewriteRule regular_expression

# На входе RewriteRule "index.php" RewriteRule ^index.php main.php [R] # На выходе: "index.php" -> "main.php"

Мы преобразовали index.php в main.php и выполнили редирект.

Важно : RewriteRule обычно принимает два аргумента: что нужно заменить и на что нужно заменить. Если нам не нужно выполнять замену то можно записать в виде:

Символ «-» означает «не преобразовывать»

RewriteBase

После всех RewriteRule, в силу вступает RewriteBase. Если получившийся после преобразований запрос является относительным и отличается от исходного, RewriteBase восстановит его, сделав абсолютным. RewriteBase просто допишет себя к запросу слева. Потому что значение RewriteBase - путь от корня сайта до.htaccess. В нашем случае.htaccess лежит прямо в корне, поэтому:

Синтаксис : RewriteBase URL-path-from-.htaccess-file-to-site-root

Например:

# .htaccess находится в /dir/ # Путь от корня сайта до.htaccess /dir/ RewriteBase /dir/ # Запрос http://example.com/dir/logo.gif # На вход RewriteRule попадает "logo.gif" RewriteRule ^logo.gif$ logo-orange.gif # После RewriteRule: "logo.gif" -> "logo-orange.gif" # После RewriteBase: "logo-orange.gif" -> "/dir/logo-orange.gif"

Regular expressions

Регулярные выражения, которые вам могут встретиться в.htaccess.

Символ Значение Пример
. Один любой символ c.t это cat , cot , cut , и т. д.
+ Один или несколько одинаковых символов a+ это a , aa , aaa , и т. д.
* Ноль или несколько одинаковых символов a* работает также как и a+ но в случае a* условию удовлетворит и пустая строка
? Совпадение опционально colou?r подойдет как color , так и colour .
^ Символ, с которого начинается строка ^a соответствует строка, которая начинается с a
$ Символ, которым заканчивается строка a$ соответствует строка, которая заканчивается a .
() Находит и запоминает соответствие группы символов.

Также может быть использовано для Back-Reference (смотри пример)

(ab)+ удовлетворит ababab

Back-Reference example:

RewriteRule ^/(+) /(.*) $ /home?page=$1 &id=$2

/album/123 → /home?page=album &id=123

Один из возможных символов ct подойдет cut , cot или cat .

Больше regular expressions

Флаги

Синтаксис : RewriteRule regular_expression [флаг1,флаг2,флаг3]

Флаг Описание
[F] Forbidden - возвращает ошибку 403 Forbidden (запрещено).
[L] Last - остановить процесс преобразования на этом месте и не применять больше никаких правил преобразований.
Query String Append - этот флаг указывает механизму преобразований на добавление, а не замену , строки запроса из URL к существующей, в строке подстановки.
PassThrough - останавливает процесс преобразования и передает полученную новую ссылку дальше по цепочке.
[R] Redirect - останавливает процесс преобразования и возвращает результат браузеру клиента как редирект на новую страницу.
[S] Skip - пропускает следующее правило, если текущее правило сработало. Можно указать количество последующих игнорируемых правил .

Полная поддержка директив.htaccess прилагается...

Пролонгации домена 199-00 руб

Правила преобразования ссылок:

Если в подкаталогах в.htaccess нет ни одной директивы модуля mod_rewrite, то все правила преобразования наследуются из родительского каталога.

При наличии в файле.htaccess каких либо директив модуля mod_rewrite не наследуется ничего, а состояние по умолчанию выставляется таким же, как в главном конфигурационном файле веб-сервера (по умолчанию "off"). Поэтому, если нужны правила преобразования для конкретного каталога, то нужно еще раз вставить директиву "RewriteEngine on" в.htaccess для конкретного каталога.

При наследовании правил из верхних каталогов и добавлении к ним новых свойственных только данному каталогу - необходимо выставить в начале следущее: "RewriteEngine on" и - последняя директива сообщает серверу о продолжении.

Для того что бы склеить веб-домен

Для того что бы избавиться раз и навсегда от www, и склеить домен без www (http://сайт т.е. в адресной строке больше ни когда не будет домена с www - http://www.сайт), нужно использовать следующий код:

RewriteEngine on

RewriteCond %{HTTP_HOST} ^www\.сайт

RewriteRule ^(.*)$ http://сайт/$1

Htaccess перенаправление - редиректом 301 - "документ перемещен навсегда" с легкостью решает эту задачу.

Что бы сделать наоборот - склеить сайт без www (http://сайт), с www (http://www.сайт - т.е. использовать в урлах только его) необходимо использовать следующий код.htaccess размещенный в корне домена:

RewriteEngine on

RewriteCond %{HTTP_HOST} ^сайт

RewriteRule ^(.*)$ http://www.сайт/$1

Выставляем на суд общественности присланную нам конфигурацию - настройку.htaccess "/" - слеша, с подстановкой его в конце и так же с принудительным его убираем.

Убрать слэш в конце url, .htaccess убираем слэш в конце строки урла - ссылки

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d # не каталог

RewriteCond %{REQUEST_URI} ^(.+)/$ # окончивается в том числе на точку в конце

RewriteRule ^(.+)/$ /$1 # убираем слеш в конце url - после последнего символа

Добавить слэш в конце url, htaccess добавляем слэш в конце строки урла - ссылки

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f # не файл

RewriteCond %{REQUEST_URI} !(.*)/$ # не окончивается в том числе на точку в конце

RewriteRule ^(.*[^/])$ $1/ # ставим - добавляем слеш в конце url - после последнего символа

RewriteCond %{ REMOTE _ USER } !=""

RewriteCond /home/(%{REMOTE_USER}) -d

RewriteRule (.*) /home/%1/$1

Есть два каталога /home/net/storag1 и /home/net/storage2, в которых нужно искать запрашиваемые файлы:

RewriteCond /home/net/storage1/%{REQUEST_FILENAME} -f

RewriteRule (.+) /home/net/storage1/$1 [L]

RewriteCond /home/net/storage2/%{REQUEST_FILENAME} -f

RewriteRule (.+) /home/net/storage2/$1 [L]

Закрыть доступ к веб-сайту в рабочее время:

>1000

RewriteCond %{TIME_HOUR}%{TIME_MIN} <1900

RewriteRule .* - [ F ]

Перенаправление пользователя с определенным юзер-агентом - браузером на определенную версию сайта (например, при заходе с айфона - перенаправлять направить пользователя на поддомен с специальной мобильной версией сайта:

RewriteEngine on

RewriteRule .* http://iphone.сайт/ [R]

Или же перенаправлять не на поддомен, а в специальный каталог сайта /iPhone-versia/, код.htaccess следующий:

RewriteEngine on

RewriteCond %{HTTP_USER_AGENT} iPhone

RewriteCond %{REQUEST_URI} !^/iPhone-versia/

RewriteRule .* /iPhone-versia/ [R]

В данном случае мы применили глобальную переменную HTTP заголовка "User-Agent", который отправляют все браузеры при заходе на любой ресурс (этот заголовок в ряде браузером можно изменять на любое значение, но в 99% это ни кто не делает, так как это снижает комфорт серфинга в интернете, так как, например ряд сайтов верстает версту -дизайн сайта под каждый браузер, с учетом его специфики выполнения спецификаций HTML5, CSS и других стандартов, которые разные браузеры часто выполняют со значительными отличиями.

Браузер iPhone имеет значение "User-Agent" следующее:

Mozilla/5.0 (iPhone; U; CPU like Mac OS X; ru)

AppleWebKit/420+ (KHTML, like Gecko) Version/3.1 Mobile/1C25 Safari/419.5

Перенаправление домашних каталогов для чужаков

Описание:

Мы хотим перенаправить URL домашних каталогов на другой веб-сервер www.somewhere.com когда запрашиваемый пользователь не принадлежит локальному домену ourdomain.com. Это иногда используется в контексте виртуальных хостов.

Просто правило на перенаправление:

Перенаправление несуществующих URL на другой веб-сервер

Описание:

Типичный часто задаваемый вопрос по URL преобразованиям - это как перенаправить несуществующие запросы с сервера А на сервер B. Обычно это делается через ErrorDocument CGI-скрипты на Perl, однако с модулем mod_rewrite тоже есть решение. Заметьте однако, что это менее ресурсоёмко чем использвание ErrorDocument CGI-скрипта!

Первое решение имеет лучшую производительность однако меньшую гибкость и меньшую защиту от ошибок:

RewriteEngine on

RewriteCond /your/docroot/%{REQUEST_FILENAME} !-f

Проблема здесь в том, что это будет работать только для страниц находяшихся внутри DocumentRoot. Тогда как вы можете добавить больше условий (например ещё и для управления домашними каталогами, и т.д.) есть лучший вариант:

RewriteEngine on

RewriteCond %{REQUEST_URI} !-U

RewriteRule ^(.+) http://webserverB.dom/$1

Здесь используется функция опережающей проверки URL (look-ahead), присутствующая в mod_rewrite. В результате это будет работать для всех типов URL и к тому же это безопасно. Однако это снижает производительность веб-сервера, потому что для каждого запроса производится более одного внутреннего подзапроса. Поэтому, если ваш веб-сервер имеет мощный процессор, используйте этот вариант. Если это медленная машина, используйте первый или лучше ErrorDocument CGI-скрипта.

Редиректы в зависимости от времени

Описание:

Когда нужно применять уловки типа содержания зависящего от времени масса вебмастеров все ещё используют CGI скрипты которые производят редиректы на специальные страницы. Как это может быть сделано через mod_rewrite?

Есть много переменных названных TIME_xxx для условий редиректа. В связке со специальными лексикографическими образцами для сравнения STRING и =STRING мы можем производить редиректы зависящие от времени:

RewriteEngine on

RewriteCond %{TIME_HOUR}%{TIME_MIN} >0700

RewriteCond %{TIME_HOUR}%{TIME_MIN} <1900

RewriteRule ^foo\.html$ foo.day.html

RewriteRule ^foo\.html$ foo.night.html

Это выдает содержимое foo.day.html при запросе URL foo.html с 07:00 до 19:00 а в оставшееся время содержимое foo.night.html. Просто класная вещь для какой-либо странички…

Управление содержанием - От старого с новому (внутреннее)

Описание:

Предположим что мы недавно переименовали страницу bar.html в foo.html и сейчас хотим для обратной совместимости сделать доступным и старый URL. В действительности мы хотим чтобы пользователи использующие старый URL даже не узнали что страницы были переименованы.

Мы перенаправим старый URL на новый через внутренний редирект путем следующих директив:

RewriteEngine on

RewriteBase /~quux/

RewriteRule ^foo\.html$ bar.html

От старого с новому (внешнее)

Описание:

Снова предположим что мы недавно переименовали страницу bar.html в foo.html и хотим сейчас для обратной совместимости сделать доступным и старый URL. Однако, в этот раз мы хотимчтобы пользователи использующие старый URL узнали этот новый URL, т.е. адресная строка их браузеров также должна измениться.

Мы используем HTTP редирект на новый URL который приведет к к изменениям в браузерах(в адресной строке) и таким образом это видят пользователи:

RewriteEngine on

RewriteBase /~quux/

RewriteRule ^foo\.html$ bar.html [R]

Содержимое зависимое от браузера

Описание:

Иногда, по крайней мере для важных страниц верхнего уровня необходимо предоставить оптимизированное для конкретного браузера содержание, т.е. для одного нужно выдавать полную версию для последних версий Netscape, минимальную для браузеров Lynx и промежуточную для всех других.

Мы не можем использовать content negotiation потому что браузеры не не представляют свой тип в этой форме. Вместо этого мы должны использовать HTTP заголовок «User-Agent». Следующее условие делает следующее: Если HTTP заголовок «User-Agent» начинается с «Mozilla/3», страница foo.html преобразуется в foo.NS.html и редирект прекращается. Если браузер «Lynx» или «Mozilla» версий 1 или 2 URL становится foo.20.html. Все остальные браузеры получают страницу foo.32.html. Это делается следующим набором директив:

RewriteCond %{HTTP_USER_AGENT} ^Mozilla/3.*

RewriteRule ^foo\.html$ foo.NS.html [L]

RewriteCond %{HTTP_USER_AGENT} ^Lynx/.*

RewriteCond %{HTTP_USER_AGENT} ^Mozilla/.*

RewriteRule ^foo\.html$ foo.20.html [L]

RewriteRule ^foo\.html$ foo.32.html [L]

Динамическое зеркало

Описание:

Предположим что есть чудесные страницы на удалённых хостах и мы хотим внести их в наше пространство имен(сайт). Для FTP серверов мы бы использовали программу зеркало которая в действительности управляет обновлениями копий удалённых данных на локальной машине. Для веб-сервера мы могли бы использовать программу webcopy которая делает похожие вещи по HTTP. Однако обе эти технологии имеют один главный недостток: локальная копия актуальна всегда настолько, насколько часто мы запускаем эту программу. Было бы намного лучше если бы зеркало было не статическим должно быть полное соответствие копий, вне зависимости от частоты запуска этой программы. Вместо этого мы хотим динамическое зеркало с автоматическим обновлением данных когда это необходимо (обновление данных на удаленном сервере).

Для обеспечения этой функции мы отобразим удаленную страницу или даже полностью удаленный сайт в наше веб-пространство используя Proxy Throughput опцию (флаг [P]):

RewriteEngine on

RewriteBase /~quux/

RewriteRule ^hotsheet/(.*)$ http://www.tstimpreso.com/hotsheet/$1 [P]

RewriteEngine on

RewriteBase /~quux/

RewriteRule ^usa-news\.html$ http://www.quux-corp.com/news/index.html [P]

Обратное динамическое зеркало

Описание:

RewriteEngine on

RewriteCond /mirror/of/remotesite/$1 -U

RewriteRule ^http://www\.remotesite\.com/(.*)$ /mirror/of/remotesite/$1

От статики к динамике

Описание:

Как можно трансформировать статическую страницу foo.html в её динамический вариант foo.cgi незаметным образом, т.е. так чтобы ни браузер ни пользователь не заметили этого.

Мы просто перенаправляем URL на CGI-скрипт и корректируем MIME-тип так чтобы это действительно работало как CGI-скрипт. Таким образом запрос к /~quux/foo.html внутренне приведет к вызову /~quux/foo.cgi.

RewriteEngine on

RewriteBase /~quux/

RewriteRule ^foo\.html$ foo.cgi

Регенерация содержания на лету

Описание:

Здесь рассматривается действительно вещь для посвященных: Динамически созданные однако статически обслуживаемые страницы, т.е. страницы которые должны передаваться как чисто статические (считываемые из файловой системы и затем передаваемые по запросу), однако они должны быть динамически сгенерированны веб-сервером если они отсутствуют в файловой системе. Таким образом вы можете иметь страницы сгенерированные CGI которые являются статически обслуживаемыми если только кто-либо (либо планировщик) не удалит статическое содержание. В таком случае содержание обновляется.

Это делается следующим набором директив:

RewriteCond %{REQUEST_FILENAME} !-s

RewriteRule ^page\.html$ page.cgi

Здесь, запрос к page.html приводит к внутреннему запуску соответствующего page.cgi если page.html все-ещё отсутствует или имеет нулевой размер. Фокус здесь в том что page.cgi это обычный CGI скрипт который (в дополнение к собственному STDOUT) записывает свой вывод в файл page.html. Запустив это один раз, сервер передает данные page.html. Когда вебмастер хочет обновить содержание, он просто удаляет page.html (обычно с помощью cronjob).

Перенаправление по языку определенному по веб-браузеру зашедшего

Описание:

Файл Htaccess перенаправит посетителя с определенным языком на определенную вами страницу с соответствующим содержанием.

Оставляем естественное нужный язык (например zh -китайский), и ставим свою страницу вместо http://сайт/doc/additional_material/index.php:

RewriteEngine on

RewriteCond %{HTTP:Accept-Language} (aa|ab|af|am|ar|as|ay|az|ba|be|bg|bh|bi|bn|bo|br|ca|co|cs|cy|da|de|dz|el|en|eo|es|et|eu|fa|fi|fj|fo|fr|fy|ga|gd|gl|gn|gu|ha|hi|hr|hu|hy|ia|ie|ik|in|is|it|iw|ja|ji|jw|ka|kk|kl|km|kn|ko|ks|ku|ky|la|ln|lo|lt|lv|mg|mi|mk|ml|mn|mo|mr|ms|mt|my|na|ne|nl|no|oc|om|or|pa|pl|ps|pt|qu|rm|rn|ro|ru|rw|sa|sd|sg|sh|si|sk|sl|sm|sn|so|sq|sr|ss|st|su|sv|sw|ta|te|tg|th|ti|tk|tl|tn|to|tr|ts|tt|tw|uk|ur|uz|vi|vo|wo|xh|yo|zh|zu)

RewriteRule ..php

Недавно освободившиеся домены с PR и ТИЦ:

Сервис http://reg.ru - крупнейшего хостинга и регистратора доменов позволяет подать заявку на регистрацию доменного имени, которое недавно было освобождено прежним Администратором. Освобожденные домены часто имеют высокие показатили ТИЦ и PR и могут быть интересны к приобретению.

Освобожденные домены.RU c ТИЦ:
Свободные премиум-домены:

Объем информации: bytes

Просмотров