htaccess - 47 наглядных примера серверного редиректа

Дмитрий Лео 18:00 -- 01.12.2015
синтаксис htaccess примеры редиректов

Наглядные примеры .htaccess

В начало .htaccess ставят:

RewriteEngine On
RewriteBase /

Первая строка включает обработку правил, вторая — обрезает полный путь (от корня сервера) до корня сайта.
/home/papka-s-saitom/public_html/razdel/podrazdel/ — таким был путь до RewriteBase /
/razdel/podrazdel/ — таким станет после

Благодаря «RewriteBase /» удобнее делать преобразования URI (убирается привязка к физическому расположению файлов сайта на сервере).

Давайте рассмотрим самые распространенные примеры:

1. Простой редирект

Для простого редиректа условия задавать не обязательно, только правило.

RewriteRule ^news/happy.* /news.html [R=301,L]

2. Реврайт без редиректа

Иногда требуется, чтобы был редирект без смены адреса, т.е. реврайт без редиректа. Для этого просто не указываем флаг редирект (R), и получаем желаемый результат, теперь по адресу news/happy получим news.html, а в адресной строке останется news/happy

RewriteRule ^news/happy.* /news.html [L]

3. Редирект с сохранением рейтинга страницы

Redirect 301 /old/old.php http://www.site.com/new.php

4. Редирект для домена с www.site.com на site.com

RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

Убираем у всех запросов вначале "WWW."

RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^/?(.*) http://%1/$1 [L,R=permanent]

5. Редирект для домена с site.com на www.site.com

RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L]

Другой вариант

RewriteCond %{HTTP_HOST} ^site\.com$ [NC]
RewriteRule ^(.*)$ http://www.site.com/$1 [R=301,L]

6. Редирект с index.php (html,htm) на главную страницу

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.(php|html|htm)\ HTTP/ 
RewriteRule ^(.*)index\.(php|html|htm)$ $1 [R=301,L]

7. Редирект с index.html на папку (удаление из строки браузера index.html)

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*index\.html?\ HTTP/
RewriteRule ^(.*)index\.html?$ http://www.site.com/$1 [R=301,L]

8. Заменить все .htm файлы на .html файлы

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)\.htm$ $1.html [R=301,L]

Другой вариант

RewriteRule     ^(.*)\.htm$  $1.html [R=301]

9. Чтобы вместо page.htm загружался файл page.html

RewriteRule     ^page\.htm$  page.html [R=301]

10. Переезд с одного домена на другой

RewriteCond %{HTTP_HOST} site.com
RewriteRule (.*) http://site.com/$1 [R=301,L]

11. Редирект всех файлов в папке на один файл

Например вы больше не нуждаетесь в разделе сайта "old" и хотите перенаправить все запросы к папке /old на один файл /new.php. Для этого добавляем в .htaccess следующий код.

RewriteRule ^old(.*)$ /new.php [L,R=301]

12. Задание типа индексной страницы (php, html, htm и другие)

Указывается порядок загрузки типов индексного файла, лежащих в корне каталога.

DirectoryIndex index.html index.php index.htm index.shtml

Проверяем доменное имя, если оно начинается с www, то сработает правило: "все, на http://%1/$1". Здесь %1 это наш домен без www (взят из условия), а $1 это адрес (взят из самого правила).

13. Убираем у всех запросов в конце index.php. Переадресуем на страницу без index.php

Поисковые системы плохо относятся к дубрям страниц. Чтобы этого избежать нужно удалить (склеить) страницы вида http://ваш_домен/ и http://ваш_домен/index.php

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

14. Определение кодировки, в которой сервер "отдает" файлы

AddDefaultCharset windows-1251

Варианты: KOI8-R, UTF-8, Windows-1251

15. Определение кодировки на загружаемые файлы

CharsetSourceEnc windows-1251

Варианты: KOI8-R, UTF-8, Windows-1251

16. Кэширование для всех типов файлов по времени доступа

ExpiresActive on
ExpiresDefault "access plus 600 seconds"

17. Кэширование для всех типов файлов по времени изменения

ExpiresActive on
ExpiresDefault "modification plus 600 seconds"

18. Кэширование для определённых типов файлов

ExpiresByType text/css "modification plus 600 seconds"
ExpiresByType image/jpeg "modification plus 600 seconds"
ExpiresByType image/gif "modification plus 600 seconds"
ExpiresByType image/x-ico "modification plus 600 seconds"
ExpiresByType image/png "modification plus 600 seconds"

19. Главная страница без дублирования

Обычно код главной страницы физически расположен в файле index.html или index.php, но сайт должен открываться по любому из запросов: site.com, site.com/index.html, www.site.com и www.site.com/index.html. Но для поисковых систем это четыре разных URL! Если не настроить .htaccess верно, поисковик добавит в свой индекс четыре одинаковых страницы. Это признак некачественного сайта. Избежать этой проблемы можно с помощью такого кода в .htaccess:

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^site.com
RewriteRule (.*) http://www.site.com/$1 [R=301,L]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html\ HTTP/
RewriteRule ^index\.html$ http://www.site.com/ [R=301,L]

20. Редирект страниц без слэша в конце URL на слеш

Чтобы предотвратить ситуацию с индексированием страниц www.site.com/about и www.site.com/about/ как разных, ставим следущий код: Со страниц без слэша будет установлен редирект на «слэшевые».

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ /$1/ [R=301,L]

Другой вариант

RewriteCond %{REQUEST_URI} !(.*)/$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\..+$
RewriteRule ^(.*)$ $1/ [L,R=301]

21. Принудительная постановка замыкающего слеша

Следующий код всегда будет добавлять слеш в адрес URL вашего сайта, что хорошо помогает в области SEO сайта.

RewriteCond %{REQUEST_URI} /+[^\.]+$
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]

22. Удалить слеш в конце

RewriteCond %{HTTP_HOST} (.*)
RewriteCond %{REQUEST_URI} /$ [NC]
RewriteRule ^(.*)(/)$ $1 [L,R=301]

23. Удаляем «category» из URL

Для изменения ссылки site.com/category/blue на site.com/blue, просто добавьте следующий код в конце вашего .htaccess файла.

RewriteRule ^category/(.+)$ http://www.site.com/$1 [R=301,L]

24. Редирект URL страницы с папки в корень сайта

Например страница лежит на сервере в site.com/category/blue.html, но надо чтобы страница работала по запросу site.com/blue.html

RewriteCond  %{DOCUMENT_ROOT}/category/$1 -f
RewriteRule ^(.*)$ category/$1 [L,QSA]

25. Редирект от GET параметров

Например, нужно что бы со страницы /?action=page&id=15 был редирект на /page/15/

RewriteCond %{QUERY_STRING} action=page [NC]
RewriteCond %{QUERY_STRING} id=(\d+) [NC]
RewriteRule .* /page/%1/? [R=301,L]

26. Редирект на мобильную версию сайта

Допустим, что мобильная версия расположена на поддомене m.site.com. Будем переходить на мобильную версию только с главной страницы основного домена.

RewriteCond %{HTTP_USER_AGENT} (?i:midp|samsung|nokia|j2me|avant|docomo|novarra|palmos|palmsource|opwv|chtml|pda|mmp|blackberry|mib|symbian|wireless|nokia|hand|mobi|phone|cdm|upb|audio|SIE|SEC|samsung|HTC|mot-|mitsu|sagem|sony|alcatel|lg|eric|vx|NEC|philips|mmm|xx|panasonic|sharp|wap|sch|rover|pocket|benq|java|pt|pg|vox|amoi|bird|compal|kg|voda|sany|kdd|dbt|sendo|sgh|gradi|jb|dddi|moto|iphone|android) [NC] 
RewriteCond %{HTTP_HOST} site.com
RewriteRule ^$ http://m.site.com/ [R=302,L]

Первой строкой мы проверяем USER_AGENT, определяем что он относится к мобильникам. (эту строку я детально не проверял, взял на просторе интернета, возможно она не совсем корректная, или есть более универсальная строка. Но на моих мобильных устройствах этот пример работает)

Второй строкой проверяем что мы находимся на нужном домене (т.к. пример не универсальный)

Третьей строкой, мы проверяем, что находимся на главной страницы (без всяких параметров и прочего) и перенаправляем на поддомен.

27. Редирект на мобильную версию сайта (Универсальная версия)

RewriteCond %{HTTP_HOST} ^(.*)$ [NC]
RewriteCond %{HTTP_USER_AGENT} (?i:midp|samsung|nokia|j2me|avant|docomo|novarra|palmos|palmsource|opwv|chtml|pda|mmp|blackberry|mib|symbian|wireless|nokia|hand|mobi|phone|cdm|upb|audio|SIE|SEC|samsung|HTC|mot-|mitsu|sagem|sony|alcatel|lg|eric|vx|NEC|philips|mmm|xx|panasonic|sharp|wap|sch|rover|pocket|benq|java|pt|pg|vox|amoi|bird|compal|kg|voda|sany|kdd|dbt|sendo|sgh|gradi|jb|dddi|moto|iphone|android) [NC]
RewriteRule ^$  http://m.%1 [R=302,L]

28. Обработка ошибок Apache

ErrorDocument 401 /401.html
ErrorDocument 403 /403.html
ErrorDocument 404 /404.html
ErrorDocument 500 /500.html

29. Сохранение (загрузка) файлов вместо открытия

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

AddType application/octet-stream .rar .doc .mov .avi .pdf .xls .mp4

30. Переадресация с www.site.com/index.php?idc=4&marea=6 на www.site.com/

RewriteCond %{QUERY_STRING} ^idc=4&marea=6$ [NC]
RewriteRule ^index\.php$ /? [R=301,L]

31. Редирект с поддомена на основной домен второго уровня

RewriteCond %{HTTP_HOST} ^test.site.com$ [NC]  
RewriteRule ^(.*)$ http://site.com%{REQUEST_URI} [R=301,NC,L,QSA]

32. Изменяем переменные php и передаём обработку другому скрипту.

RewriteCond %{QUERY_STRING} ^parameter=(.+)$
RewriteRule (.*) parameter.php\?%1 [L]

В этом примере запрос вида: index.php?parameter=some
преобразуется в: parameter.php?some

33. Убираем переменные php из запроса

(вырезаем из URI всё, что находится после знака вопроса)

RewriteRule (.*) $1? [R=301,L]

34. Заперт входа на сайт

Запрещаем вход на сайт Интернет Експлореру (вернее, кто себя так определяет) и пользователям с определённого IP-адреса (xxx.xxx.xxx.xxx).

RewriteCond %{HTTP_USER_AGENT} MSIE
RewriteCond %{REMOTE_ADDR} ^xxx\.xxx\.xxx\.xxx$
RewriteRule ^.*$ - [F]

35. Закрываем от всех

deny from all

36. Закрываем конкретный файл от всех

<Files admin.php>
deny from all
</Files>

37. Разрешаем доступ только с одного ip

order deny,allow
deny from all
allow from 192.111.37.125

38. Запрещаем доступ с конкретных ip

<Limit GET POST PUT>
order allow,deny
allow from all
deny from 192.111.35.122
deny from 192.111.37.171
</LIMIT>

39. Убираем из Урла (URL) расширение файла

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.php

php можно заменить другим расширением. Например: html, htm, shtml, asp

40. При запросе файла .htaccess говорим, что он не существует (410, GONE).

RewriteRule ^/.htaccess$ - [G]

Другой метод

RewriteRule ^/.htaccess$ - [F]

41. Запрещаем отображать содержимое директории, если нет индексного файла

Вы скорее всего хоть раз видели текст Index of и список файлов. Так происходит в том случае, когда в директории нет индексного файла (например index.php), а система предлагает выбрать файл для дальнейшего открытия. Минус этого заключается в том, что случайный пользователь может увидеть список и содержание всех файлов директории.

Options -Indexes

42. Перенаправление с HTTPS на http

RewriteCond %{HTTPS} on
RewriteRule ^.*$ http://%{SERVER_NAME}%{REQUEST_URI}

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

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

Есть много переменных названных TIME_xxx для условий редиректа. В связке со специальными лексикографическими образцами для сравнения <STRING, >STRING и =STRING мы можем производить редиректы зависящие от времени:
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.

44. Редирект в URL с подчеркивания в дефис

RewriteRule ^(.+)(\s|_)(.+)$ /$1-$3 [R=301,L]

45. Редирект в URL с больших символов на маленькие

# If there are caps, set HASCAPS to true and skip next rule
RewriteRule [A-Z] - [E=HASCAPS:TRUE,S=1]

# Skip this entire section if no uppercase letters in requested URL
RewriteRule ![A-Z] - [S=28]

# Replace single occurance of CAP with cap, then process next Rule.
RewriteRule ^([^A]*)A(.*)$ $1a$2
RewriteRule ^([^B]*)B(.*)$ $1b$2
RewriteRule ^([^C]*)C(.*)$ $1c$2
RewriteRule ^([^D]*)D(.*)$ $1d$2
RewriteRule ^([^E]*)E(.*)$ $1e$2
RewriteRule ^([^F]*)F(.*)$ $1f$2
RewriteRule ^([^G]*)G(.*)$ $1g$2
RewriteRule ^([^H]*)H(.*)$ $1h$2
RewriteRule ^([^I]*)I(.*)$ $1i$2
RewriteRule ^([^J]*)J(.*)$ $1j$2
RewriteRule ^([^K]*)K(.*)$ $1k$2
RewriteRule ^([^L]*)L(.*)$ $1l$2
RewriteRule ^([^M]*)M(.*)$ $1m$2
RewriteRule ^([^N]*)N(.*)$ $1n$2
RewriteRule ^([^O]*)O(.*)$ $1o$2
RewriteRule ^([^P]*)P(.*)$ $1p$2
RewriteRule ^([^Q]*)Q(.*)$ $1q$2
RewriteRule ^([^R]*)R(.*)$ $1r$2
RewriteRule ^([^S]*)S(.*)$ $1s$2
RewriteRule ^([^T]*)T(.*)$ $1t$2
RewriteRule ^([^U]*)U(.*)$ $1u$2
RewriteRule ^([^V]*)V(.*)$ $1v$2
RewriteRule ^([^W]*)W(.*)$ $1w$2
RewriteRule ^([^X]*)X(.*)$ $1x$2
RewriteRule ^([^Y]*)Y(.*)$ $1y$2
RewriteRule ^([^Z]*)Z(.*)$ $1z$2

# If there are any uppercase letters, restart at very first RewriteRule in fil
RewriteRule [A-Z] - [N]

RewriteCond %{ENV:HASCAPS} TRUE
RewriteRule ^/?(.*) /$1 [R=301,L]

46. Массовый редирект новых файлов

Предположим вы перешли на новую систему ссылок на вашем сайте и все файлы оканчивающиеся на старый id должны быть средирекчены. Сначала создаем в базе таблицу, которая содержит старый id и новый URL для редиректа.

old_id INT new_url VARCHAR (255)

Далее пишем код который свяжет ваши старые id с новыми URL-ами
После этого, добавляем следующую строчку в .htaccess:

RewriteRule ^/product-(.*)_([0-9]+).php /redirectold.php?productid=$2

затем создаем PHP файл redirectold.php, который будет поддерживать 301 редирект:

<?php
function getRedirectUrl($productid) {
// Connect to the database
$dServer = "localhost";
$dDb = "mydbname";
$dUser = "mydb_user";
$dPass = "password";

$s = @mysql_connect($dServer, $dUser, $dPass)
or die("Couldn't connect to database server");

@mysql_select_db($dDb, $s)
or die("Couldn't connect to database");

$query = "SELECT new_url FROM redirects WHERE old_id = ". $productid;
mysql_query($query);
$result = mysql_query($query);
$hasRecords = mysql_num_rows($result) == 0 ? false : true;
if (!$hasRecords) {
$ret = 'http://www.site.com/';
} else {
while($row = mysql_fetch_array($result))
{
$ret = 'http://www.site.com/'. $row["new_url"];
}
}
mysql_close($s);
return $ret;
}

$productid = $_GET["productid"];
$url = getRedirectUrl($productid);

header("HTTP/1.1 301 Moved Permanently");
header("Location: $url");
exit();
?>

Теперь все запросы к вашим старым URL-ам будут вызывать redirectold.php, который найдет новый URL и вернет 301 ответ с вашей новой ссылкой.

47. Красивый листинг каталогов

# ENABLE INDEXING
Options +Indexes

# INDEX OPTIONS IndexOptions +Charset=UTF-8 +FancyIndexing +IgnoreCase +FoldersFirst +XHTML +HTMLTable +SuppressRules +SuppressDescription +NameWidth=* +IconsAreLinks

# META VIEWPORT IndexHeadInsert "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />"

# HIDE /listing DIRECTORY IndexIgnore .htaccess /listing

# GENERAL ICONS (BLANK, DIRECTORY, PARENT DIRECTORY)

AddIcon /data/listing/icons/blank.png ^^BLANKICON^^ AddIcon /data/listing/icons/folder.png ^^DIRECTORY^^ AddIcon /data/listing/icons/folder-home.png .. AddIconByType (TXT,/data/listing/icons/text.png) text/* AddIconByType (IMG,/data/listing/icons/image.png) image/* AddIconByType (SND,/data/listing/icons/audio.png) audio/* AddIconByType (VID,/data/listing/icons/video.png) video/*

# EXTENSION SPECIFIC ICONS

AddIcon /data/listing/icons/archive.png .7z .bz2 .cab .gz .tar AddIcon /data/listing/icons/audio.png .aac .aif .aifc .aiff .ape .au .flac .iff .m4a .mid .mp3 .mpa .ra .wav .wma .f4a .f4b .oga .ogg .xm .it .s3m .mod AddIcon /data/listing/icons/bin.png .bin .hex AddIcon /data/listing/icons/bmp.png .bmp AddIcon /data/listing/icons/c.png .c AddIcon /data/listing/icons/calc.png .xlsx .xlsm .xltx .xltm .xlam .xlr .xls .csv AddIcon /data/listing/icons/cd.png .iso AddIcon /data/listing/icons/cpp.png .cpp AddIcon /data/listing/icons/css.png .css .sass .scss AddIcon /data/listing/icons/deb.png .deb AddIcon /data/listing/icons/doc.png .doc .docx .docm .dot .dotx .dotm .log .msg .odt .pages .rtf .tex .wpd .wps AddIcon /data/listing/icons/draw.png .svg .svgz AddIcon /data/listing/icons/eps.png .ai .eps AddIcon /data/listing/icons/exe.png .exe AddIcon /data/listing/icons/gif.png .gif AddIcon /data/listing/icons/h.png .h AddIcon /data/listing/icons/html.png .html .xhtml .shtml .htm .URL .url AddIcon /data/listing/icons/ico.png .ico AddIcon /data/listing/icons/java.png .jar AddIcon /data/listing/icons/jpg.png .jpg .jpeg .jpe AddIcon /data/listing/icons/js.png .js .json AddIcon /data/listing/icons/markdown.png .md AddIcon /data/listing/icons/package.png .pkg .dmg AddIcon /data/listing/icons/pdf.png .pdf AddIcon /data/listing/icons/php.png .php .phtml AddIcon /data/listing/icons/playlist.png .m3u .m3u8 .pls .pls8 AddIcon /data/listing/icons/png.png .png AddIcon /data/listing/icons/ps.png .ps AddIcon /data/listing/icons/psd.png .psd AddIcon /data/listing/icons/py.png .py AddIcon /data/listing/icons/rar.png .rar AddIcon /data/listing/icons/rb.png .rb AddIcon /data/listing/icons/rpm.png .rpm AddIcon /data/listing/icons/rss.png .rss AddIcon /data/listing/icons/script.png .bat .cmd .sh AddIcon /data/listing/icons/sql.png .sql AddIcon /data/listing/icons/tiff.png .tiff .tif AddIcon /data/listing/icons/text.png .txt .nfo AddIcon /data/listing/icons/video.png .asf .asx .avi .flv .mkv .mov .mp4 .mpg .rm .srt .swf .vob .wmv .m4v .f4v .f4p .ogv AddIcon /data/listing/icons/xml.png .xml AddIcon /data/listing/icons/zip.png .zip DefaultIcon /data/listing/icons/default.png

# listing FILES

HeaderName /data/listing/header.html ReadmeName /data/listing/footer.html IndexStyleSheet "/data/listing/style.css"

X