htaccess — 47 наглядных примера серверного редиректа
Наглядные примеры .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} ! 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} ! RewriteCond %{REQUEST_FILENAME}\.html 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»