Mod Rewrite (Статей: 11)

для начала создадим файл .htaccess и поместим туда следующий код
RewriteEngine On
RewriteBase /
RewriteCond %{ENV:REDIRECT_FINISH} !^$
RewriteRule ^ - [L]
#Дальше сколько угодно правил
RewriteRule ^/?([\w]+)$ /
router.php?page=$1 [E=FINISH:1,L,QSA]
далее создадим файл router.php и поместим туда этот код

<?php

include 'header.php';//шапка сайта 

//существует ли запрашиваемый файл? если нет то назначаем файл по умолчанию index
$file = file_exists(ROOT.'/pages/'.$_GET['page'].'.php') ? $_GET['page'] : 'index';


//загружаем файл
include 'pages/'.$file.'.php';

include 'footer.php';
exit;
к примеру:
при запросе site.ru/forum будет запрошен файл pages/forum.php

ЭТО ПРОСТОИ РОУТЕР ДЛЯ НОВИЧКОВ

Site: Портфолио программиста
Зачастую при разработке сайта мы сталкиваемся с проблемой ЧПУ( ЧеловекоПонятныхУрл ).
В данной статье представлен вариант устранения ошибки 500 Internal Server Error.
Попробовал и я на своей колокольне такую ошибку, много раз вскипал мозг и наконец-то "добрые люди пнули в направлении на юг".
Суть в том что mod_rewrite "ищет" подходящий шаблон под наш запрос, пока не получит нужный, бесконечно (по крайней мере на хостах обычно стоит тайм-аут, благодаря которому и срабатывает ошибка 500), но благодаря маленькой хитрости можно устранить это дело.
НАЧНЕМ:
RewriteEngine On
RewriteBase /
RewriteCond %{ENV:REDIRECT_FINISH} !^$
RewriteRule ^ - [L]
#Дальше сколько угодно правил
RewriteRule ^/?([a-z]+)$ /router.php?page=$1 [E=FINISH:1,L,QSA]
Таким образом модуль rewrite не будет срабатывать бесконечно так как наткнется на E=FINISH и сработает правило REDIRECT_.
Прошу сильно не пинать, но тем кому помогло спасибо принимается smile

Site: Система управления сайтом
Многие начинающие веб-мастера встречаются с проблемой обработки длинных адресов в строке браузера. Например, у вас есть динамическая страница, которая обрабатывает запросы на скачивание файлов, с адресом вида http://www.my-site.com.ua/cgi-bin/download/get-files.cgi. Для обработки файла нужно ввести категорию файла (к примеру, "мои файлы" — id=my-files) и название (допустим, name=My_Editor), после чего у нас получится что-то вроде http://www.my-site.com.ua/cgi-bin/download/get-files.cgi?id=my-files&name=My_Editor. Согласитесь, такой вид крайне неудобен для конечного пользователя, особенно если адрес ему приходится вводить вручную. Избежать подобных сложностей можно с помощью инструмента mod_rewrite из стандартного набора сервера Apache (http://www.apache.org/). Он позволяет созданную выше конструкцию преобразовать в запись вроде http://www.my-site.com.ua/my-files/dn_pg=My_Editor. Или вот еще один пример. Допустим, вам надо вывести статистические данные о работе компании за каждый месяц. Если не использовать mod_rewrite, то страница будет иметь вид вроде http://www.my-site.com.ua/cgi-bin/statistic.cgi?year=2000?month=06. Но все это можно представить значительно проще: http://www.my-site.com.ua/stat/2000/06. Подобных примеров использования mod_rewrite можно привести уйму, поэтому не будем долго разглагольствовать о теории, а быстрее перейдем к практике.

Итак, приступим к созданию простых адресов. Для начала нужно выяснить, поддерживает ли ваш сервер mod_rewrite. Если вы пользуетесь платным хостингом, обратитесь в службу поддержки или к администратору сервера с просьбой уточнить этот момент и в случае чего добавить такую возможность. Если же вы используете бесплатный хостинг, то придется вас огорчить — наверняка у вас ничего не получится . Правда, есть и приятные исключения — "забугорные" http://hypermart.net и http://virtuave.net.

Теперь давайте разберемся с процедурой установки перенаправлений. Все данные о новых URL-адресах нужно прописывать в файл .htaaccess, который следует разместить в основном каталоге сервера, причем закачивать его на сервер нужно в двоичном формате. Вначале документа пропишите такие строки:

Options ExecCGI FollowSymLinks Includes MultiViews
RewriteEngine on

Далее в каждой строке указывается правило перенаправления. Допустим, нам нужно сделать перенаправление с http://www.my-site.com.ua/cgi-bin/download/get-files.cgi?id=xxx&name=xxx на http://www.my-site.com.ua/xxx/dn_pg=xxx. Приписываем в .htaaccess такую строку:

RewriteRule ^/(.+)/dn_pg=(.+) /cgi-bin/download.cgi?id=$1&name=$2 [T=application/x-httpd-cgi,L]

Теперь давайте немного разберемся с синтаксисом построения указаний. Команда RewriteRule указывает серверу на перенаправление, ^/(.+)/dn_pg=(.+) — какой запрос перенаправлять, /cgi-bin/download.cgi?id=$1&name=$2 — реальный адрес перенаправления, наконец, [T=application/x-httpd-cgi,L] указывает на CGI/Perl-скрипт.

Теперь зададим правило для перенаправления по второму примеру:

Options ExecCGIFollowSymLinks Includes MultiViews
RewriteEngine on
RewriteRule ^stat/([0-9]+)/([0-9]+) /cgi-bin/statistic.cgi?year=$1&month=$2

Последняя строка задает формат, в данном случае цифры от 0 до 9 — ([0-9]+), — и перенаправляет каждую цифру на соответствующий адрес ($1,$2). Запись ([0-9]+) свидетельствует про обработку только цифр, то есть буквы затрагиваться не будут.

Также бывают ситуации, когда нужно сделать редирект со старой страницы на новую. Вот пример подобного сценария:

Options ExecCGI FollowSymLinks Includes MultiViews
RewriteEngine on
RewriteBase /my-files/ # задаем папку, в которой находился старый документ
RewriteRule ^old.html$ new.html # перенаправляем со страницы old.html на new.html

Бывают такие ситуации, когда нужно, чтобы начальная страница запускалась с множеством параметров (это когда вы используете CGI- или PHP-скрипты и хотите, чтобы при первой загрузке сайта в них передавались какие-нибудь данные). Допустим, мы будем передавать данные с http://www.my-site.com.ua на http://www.my-site.com.ua/cgi-bin/index.cgi?topic=main&page=1. Чтобы организовать такой редирект, нам нужно прописать следующие строки:

Options ExecCGI FollowSymLinks Includes MultiViews
RewriteEngine on
RewriteRule ^$ /cgi-bin/index.cgi?topic=main&page=1 [T=application/x-httpd-cgi,L]

Теперь, когда пользователь набирает в строке браузера http://www.my-site.com.ua, то он перенаправится на http://www.my-site.com.ua/cgi-bin/index.cgi?topic=main&page=1, но в строке браузера по-прежнему будет значиться адрес http://www.my-site.com.ua/. Если добавить в [T=application/x-httpd-cgi,L] параметр R, то перенаправление будет явным, а не скрытым.

Теперь давайте сделаем сложный перевод, например, чтобы первая страница (чаще всего это index.html) перенаправлялась на http://www.my-site.com.ua/home, а http://www.my-site.com.ua/home в свою очередь скрыто исполняла CGI-скрипт с параметрами http://www.my-site.com.ua/cgi-bin/index.cgi?topic=main&page=1. Для этого снова редактируем файл .htaccess, в котором пишем следующее:

Options ExecCGI FollowSymLinks Includes MultiViews
RewriteEngine on
RewriteRule ^$ /home [R]
RewriteRule ^index.html /home [R]
RewriteRule ^home$ /cgi-bin/index.cgi?topic=main&page=1 [T=application/x-httpd-cgi,L]
RewriteRule ^$ /home [R]

Сначала перенаправляем http://www.my-site.com.ua на home, далее index.html на тот же home (на тот случай, если кто-нибудь вздумает набрать в строке браузера http://www.my-site.com.ua/index.html) и в конце перенаправляем home на cgi-bin/index.cgi?topic=main&page=1. Хочу заметить одну важную деталь — если в строке браузера ввести http://www.my-site.com.ua/home/ (в конце добавим /), то пользователь получит ошибку. Это связано со спецификой компонента mod_rewrite. Поэтому для таких ситуаций нужно прописывать еще одну строку:

RewriteRule ^home/ /home [R]

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

P.S. Если вы неплохо владеете английским, то можете зайти на http://www.engelschall.com/pw/apache/rewriteguide, где найдете полное описание mod_rewrite.
R[=code]- Перейти на новый URL, с дополнительным кодом (см. ниже)..
F - Запретныей (Отпровляет заголовок 403)
G - Gone (не существует)
P - Прокси
L - Последнее правило
N - Следующая (т.e. Перезагрузка правила)
C - Chain
T = mime-type - Установить Mime Type
NS - Пропустить, если есть внутренний подзапрос
NC - Не учитывать регистр
QSA - Добавить строку запроса
NE - Do not escape output
PT - Пройдя через
S = x - Перейти x следующих правил
E = var:value - Установить значение переменной окружения "Var" на "value".
Кривой - но все же перевод!
в корневой директории создаем .htaccess с содержанием:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(.+)\.вашсайт\.com$ [NC]
RewriteCond %{HTTP_HOST} !^www\.вашсайт\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/subdomains
RewriteRule ^(.*) %{HTTP_HOST}$1
RewriteRule ^(.*)\.вашсайт\.com(.*) /subdomains/$1$2
RewriteRule ^subdomains\.(.*) /subdomains/$1
и файл httpd.conf с содержанием:

<Directory /domains/вашсайт.com/html>
Options FollowSymLinks
AllowOverride All
</Directory>
<VirtualHost вашсайт.com>
ServerAdmin admin@вашсайт.com
ServerAlias *вашсайт.com
Virtual DocumentRoot /domains/вашсайт.com/html/%1
ServerName вашсайт.com
ErrorLog logs/вашсайт.com-error_log
CustomLog logs/вашсайт.com-access_log common
</VirtualHost>
В корне создаем папку subdomains
Пример:
хотим получить поддомен umax.вашсайт.com
1 - идем в subdomains и создаем там папку umax
2 - всё!
Часто хостинговые провайдеры накладывают ограничение на количество уикальных сайтов, и зачастую под это ограничение попадают и поддомены. Данное ограничение можно обойти средствами .htaccess. Например мы хотим направить поддомен forum.yourdomain.net на директорию ~/forum для этого необходимо направить нужные поддомены на папку с остновным сайтом и создать вложенную директорию например forum
RewriteEngine on
RewriteCond %{HTTP_HOST} ^forum\.yuordomain\.net$ [NC]
RewriteCond %{REQUEST_URI} !^/forum/$ [NC]
RewriteRule (.*) /forum/$1 [L]
Сайт перенесен с одного домена на другой с domain.com на domain2.com
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.domain\.com$ [R=301,1]
RewriteRule ^(.*)$ http://www.domain2.com/$1
Перенаправление несуществующих URL на другой веб-сервер
RewriteEngine on
RewriteBase   /
RewriteCond /your/docroot/%{REQUEST_FILENAME} !-f
RewriteRule ^(.+) http://webserverB.dom/$1 
Необходимо запрос любой страницы сайта отправлять на одну (будет написано что сайт временно ен доступен), но в то же время нужно оставить его открытым для поисковых машин. То есть для клиентов сайт закрыт, а для индексации - открыт.
RewriteEngine on
RewriteBase   /
RewriteCond %{HTTP_USER_AGENT} !^yandex.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} !^googlebot.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} !^gaisbot.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} !^rambler.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} !^aport.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} !^metacrawler.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} !^msnbot.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} !^crawler.* [NC,OR]
RewriteRule ^/$ - [L,R]
Указание доступа к сайту по времени
RewriteEngine on
RewriteCond %{TIME_HOUR}%{TIME_MIN} > 900
RewriteCond %{TIME_HOUR}%{TIME_MIN} < 1800
RewriteRule .* - [ F ]
Облако тегов / Авторы