mod_rewrite Примеры

При помощи mod_rewrite можно обрабатывать те или иные адреса. Возможности модуля достаточно велики - ведь используются регулярные выражения. Однако, “типовых” задач не так уж много. Итак… сборник “шпаргалок” по mod_rewrite для начинающих.

Перенаправление на сайт с www

# нерабочий вариант:
RewriteCond %{SERVER_NAME} !^www.*$
RewriteRule ^(.*)$ http://www.%{SERVER_NAME}/$1 [R]

# рабочий вариант:
RewriteCond    %{HTTP_HOST}            !^www\.
RewriteRule    (.*)                http://www.%{HTTP_HOST}/$1 [R=301,L]

# Перенос наоборот - переносим все что с “www” на БЕЗ “www”
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [L,R=301]

Перенаправление http на https и наоборот (вместе не использовать!):


# с http на https
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [L]
# с HTTPS на HTTP:
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]

Добавляем закрывающий слэш в конце

# этот вариант почему-то перебрасывал с домена www. на домен без www
RewriteRule ^([a-zA-Z0-9/-]*[^/])$ $1/ [R=301]
#Слегка модифицировал, и редирект стал осуществляться на тот же домен:
RewriteRule ^([a-zA-Z0-9/-]*[^/])$ http://%{HTTP_HOST}/$1/ [R=301]

Редирект адресов с вопросительным знаком (всех)

при необходимости, можно добавить проверку на %{QUERY_STRING} - раскомментировать

RewriteCond %{THE_REQUEST} "\?"
# RewriteCond %{QUERY_STRING} ^$
RewriteRule .* %{REQUEST_URI}? [R=301,L]

Как склить index.php , index.html index.asp итд с главной страницей сайта (с корнем:


# при нулевой строке запроса перенаправляем ПОЛНЫЕ вхождения
RewriteCond %{REQUEST_URI} ^/(index.aspx|default.aspx|default.asp|index.asp|index.html|index.htm|index.php)$
RewriteCond %{QUERY_STRING} ^$
RewriteRule .* / [R=301,L]
# проверить на работоспособность
RewriteCond %{REQUEST_URI} ^/index\.(.+)$
RewriteRule .+ / [R=301,L]
# вариант не совсем корректный, т.к. %{THE_REQUEST}
#содержит запрос целиком: GET /index.php HTTP/1.1
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html\ HTTP/
RewriteRule ^index\.html$ http://www.yoursite.ru/ [R=301,L]

RewriteCond %{THE_REQUEST} index.html
RewriteRule index.html / [R=301,L]

Убираем index.php из адресов (для ссылок с ? GET-параметрами в строке запроса) - т.е. редирект
с http://site.ru/index.php?a=1&b=2 на http://site.ru/?a=1&b=2

RewriteEngine on
RewriteCond %{THE_REQUEST} "^GET (.*)/index\.php\?"
RewriteRule .* %1/?%{QUERY_STRING} [R=301,L]

или (аналогично)
RewriteEngine on
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^index\.php$ / [R=301,L]

Убираем index.php из адресов (перенаправляем со страниц вида index.php/page/3 на /page/3):

RewriteCond %{THE_REQUEST} index.php
RewriteRule ^index.php/(.*) /$1 [R=301,L]

Сделать редирект только для определённых адресов

RewriteCond %{REMOTE_ADDR} =192.168.0.1 [OR]
RewriteCond %{REMOTE_ADDR} =192.168.0.2 [OR]
#...
RewriteCond %{REMOTE_ADDR} =192.168.0.3
RewriteRule .* http://rewrite.cond.url [L,R]

Аналогично - средствами PHP
$bad_addresses = array('192.168.0.1','192.168.0.2');
if (in_array($_SERVER['REMOTE_ADDR'],$bad_addresses)) {
header('Location:rewrite.url');
exit();
}

Редирект адресов с пробелами
Для перенаправления адресов с пробелами следует использовать обратный слэш для экранирования
RewriteRule url\ with\ space /new_url [R=301,L]

Метки: , ,

Автор будет признателен, если Вы поделитесь ссылкой на статью, которая Вам помогла:
BB-код (для вставки на форум)

html-код (для вставки в ЖЖ, WP, blogger и на страницы сайта)

ссылка (для отправки по почте)

Комментарии (7) к записи “mod_rewrite Примеры”

  1. Alter сообщает :

    Как реализовать данную задачу?
    Написать правило роутинга таким образом, что бы все запросы приходящие на веб-сервер отдавались на файл index.php. Исключения является только медиа-файлы (*.jpg, *.png, *.gif, *.js, *.css, …), они отдаются непосредственно.

  2. Семён сообщает :

    Это элементарно, альтер! Смотри любой хтассецц для цмсок
    автару спасибо, нашел как индекс склеить чтобы дублей не было

  3. Федя сообщает :

    Спасибо за реврайт на страницу со слэшом или слэшем.. как правильно не знаю. В общем product -> product/ - полдня бился, не смог найти.

  4. Lisa сообщает :

    Здрасти
    Помогите мне пожалуйста как сделать на это например что бы когда любой адрес который начинался бы вот так
    > component/muscol/?view
    Вот полный адреса примера такиз адресов много только номера ID разные
    http://examle.com/component/muscol/?view
    Именно адреса в в которых есть ?view и которые после ?view не открывались
    Как бы сделать 303 на главную или 404 не получаться, во всяком случае у меня

  5. RewriteGuru сообщает :

    #—
    RewriteCond %{HTTPS} =off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [QSA,L]
    #—
    RewriteCond %{SERVER_PORT} !^443$
    RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
    #—
    RewriteCond %{ENV:HTTPS} !on
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    #—
    RewriteCond %{HTTP:X-HTTPS} !1
    RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
    #—
    RewriteCond %{HTTP:CF-Visitor} ‘”scheme”:”http”‘
    RewriteRule ^(.*)$ https://www.domain.com/$1 [L] #не забудьте заменить домен
    #—
    RewriteCond %{HTTP:X-Forwarded-Protocol} !=https
    RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
    #—
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteCond %{HTTPS} off
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]

  6. ВотТак сообщает :

    RewriteCond %{HTTP_X_FORWARDED_PROTO} http
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

  7. 11111 сообщает :

    RewriteCond %{SERVER_PORT} ^443$ [OR]
    RewriteCond %{HTTPS} =on
    RewriteRule ^(.*)$ http://site.ru/$1 [R=301,L]

Добавить комментарий