Конфигурационный файл .htaccess
является конфигом для веб-серверов на Apache. Большинство хостингов работают через этот сервер, поэтому на каждом сайте присутствует этот файл. Вебмастера могут частично управлять его работой внося в него свои изменения. В этой статье мы рассмотрим директивы и правила, которые можно менять в работе сервера.
Оглавление
- Правила Redirect, RewriteRule и RewriteCond
- Примеры 301 редиректов в .htaccess
- Редирект с одной страницы на другую
- Редирект со всех файлов .htm на .html
- Редирект всего каталога на другую страницу
- Удаление лишних слэшей в адресе URL
- Реврайт без редиректа
- Простанавка замыкающего слеша в конце адреса главной страница
- Удаляем директорию каталога из URL
- Редирект GET параметров
- Редирект на мобильную версию сайта m.site.ru
- Редирект с поддомена
- Другие примеры с htaccess
Самый главный файл .htaccess
располагается в корне сайта:
http://site.ru/.htaccess
Его действия распространяются на текущий каталог и на все вложенные каталоги. Т.е. у владельцев сайтов есть возможность воздействовать только на работу своего проекта, не мешая работе всего сервера. Если этот файл отсутствует, то его можно создать с помощью любого блокнота. Главное, чтобы название файла было «.htaccess» — без форматов .txt, .doc и т.д.
Через файл .htaccess
чаще всего настраивают 301 редиректы на уровне сервера, что сильно ускоряет процесс перехода на новую страницу, т.к. не надо загружать промежуточную страницу. Также здесь прописывается какой файл обрабатывает 404એ ошибку.
Чуть ниже мы рассмотрим все распространенные варианты редиректов через .htaccess
, а для начала ознакомимся с опциями и правилами.
Чтобы иметь возможность работать с редиректами нужно включить модуль ReWriteEngine. Для этого необходимо прописать две строчки кода (желательно в самом верху файла .htaccess
):
Options +FollowSymLinks RewriteEngine On
Разместите эти строки в самом верху файла .htaccess
, чтобы иметь возможность работать с директивами модуля mod_write.
Также на хостинге должны быть включены модули mod_alias (для поддержки Redirect, RedirectPermanent и RedirectMatch).
1. Правила Redirect, RewriteRule и RewriteCond
1.1. Директива Redirect
Синтаксис Redirect:
Redirect [status] /откуда http://куда_полный_адрес
Redirect устанавливает прямой редирект с одной страницы на другую.
В status
пишут код редиректа. Является необязательным параметром. Чаще всего пишут 301, что сигнализирует о постоянном смене адреса страницы.
Важно, чтобы страница «откуда» была прописана в формате без указания полного адреса сайта, но с указанием полного относительного адреса URL начиная со слэша «/» (т.е. с корня сайта). Страницу куда идет редирект нужно писать полностью, т.е. абсолютный адрес страницы URL (т.е. с названием домена и протокола httpએ или httpsએ).
Например
Redirect 301 /oldpage.php http://site/newpage.php
Можно также писать по другому
RedirectPermanent 301 /oldpage.php http://site/newpage.php или Redirect permanent 301 /oldpage.php http://site/newpage.php
1.2. Директива RewriteRule
Директива RewriteRule устанавливает правила перехода. Синтаксис следующий:
RewriteRule Шаблон Подстановка [коды]
- При внешнем редиректе меняется урл адреса в строке браузера — «[R=301,L]»
- При внутреннем — не меняет урл адреса в строке браузера — «[R=301]» или «[L]»
1.3. Директива RewriteCond
Директива RewriteCond определяет условия при котором выполняется правила в RewriteRule.
RewriteCond Сравниваемая_Строка Условие
Например, этими условиями могут быть браузер пользователя, IP-адрес, заголовок и т.д.
1.4. Директива RedirectMatch
Директива RedirectMatch аналогична Redirect с той лишь разницей, что позволяет записывать регулярные выражения.
RedirectMatch [status] Откуда Куда
2. Примеры 301 редиректов в .htaccess
Мы уже рассматривали множество примеров с редиректом по .htaccess
в статьях:
- 301 редирект для удаления/добавления слэша в конце URL
- 301 редирект с index (.html и .php) на корень сайта «/»
- Редирект 301 с http на https
- Редирект 301 с www на без www
- Смена адреса сайта — редирект со старого домена на новый
Здесь мы дополним варианты редиректов, которых еще не было.
2.1. Редирект с одной страницы на другую
Редирект с site.ru/cat/oldpage на site.ru/newpage.html
RewriteRule ^cat/oldpage.* /newpage.html [R=301,L]
Или второй вариант:
Redirect 301 /cat/oldpage http://www.site.com/newpage.php [R=301,L]
2.2. Редирект со всех файлов .htm на .html
RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)\.htm$ $1.html [R=301,L]
Или второй вариант:
RewriteRule ^(.*)\.htm$ $1.html [R=301]
2.3. Редирект всего каталога на другую страницу
С любой страницы в каталоге и подкаталогах /old/ будет происходит редирект на /new.php
RewriteRule ^old(.*)$ /new.php [L,R=301]
2.4. Удаление лишних слэшей в адресе URL
Например, страница /catalog///stranica.html доступна и открывается. Чтобы избежать такой ситуации и не плодить бесконечное число дублей следует записать следующий редирект
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$ RewriteRule . %1/%2 [R,L]
2.5. Реврайт без редиректа
Можно загрузить другую страницу без смены адреса страницы URL. Например, загрузим страницу /news.html, а в адресной строке будет отображаться адрес /news/happy
RewriteRule ^news/happy.* /news.html [L]
2.6. Простановка замыкающего слеша в конце адреса главной страница
Например, многие сервера работают так, что последний слэш не пишется в URL. Например, http://site.ru. Ниже приведенный код решают это проблему: сайт будет открывать по http://site.ru/
RewriteCond %{REQUEST_URI} /+[^\.]+$ RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]
2.7. Удаляем директорию каталога из URL
Например для редиректа со страницы site.com/directoriya/stranica.html на site.com/stranica.html нужно прописать следующее:
RewriteRule ^directoriya/(.+)$ http://site.com/$1 [R=301,L]
Или второй вариант:
RewriteCond %{DOCUMENT_ROOT}/directoriya/$1 -f RewriteRule ^(.*)$ directoriya/$1 [L,QSA]
2.8. Редирект GET параметров
Например, сделать редирект со страницы /?act=page&id=2 на /page-2/
RewriteCond %{QUERY_STRING} act=page [NC] RewriteCond %{QUERY_STRING} id=(\d+) [NC] RewriteRule .* /page/%1/? [R=301,L]]
2.9. Редирект на мобильную версию сайта m.site.ru
В данном примере сначала проверяется факт того, что пользователь открыл сайт с мобильного устройства {HTTP_USER_AGENT}
, далее происходит замена адреса сайта на m.URL
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]
2.10. Редирект с поддомена
Например, выполним редирект с любой страницы поддомена poddomen.site.ru на основной домен site.ru
RewriteCond %{HTTP_HOST} ^poddomen.site.ru$ [NC] RewriteRule ^(.*)$ http://site.ru%{REQUEST_URI} [R=301,NC,L,QSA]
3.Другие примеры с htaccess
3.1. Запретить IP-адрес и браузер
Запретим открывать сайт для пользователя с браузера IE с IP-адресом 172.111.222.55
RewriteCond %{HTTP_USER_AGENT} MSIE RewriteCond %{REMOTE_ADDR} ^172\.111\.222\.55$ RewriteRule ^.*$ - [F]
3.2. Запретить конкретный файл
Запретим для всех файл disable_file.html:
<Files disable_file.html> deny from all </Files>
3.3. Разрешить доступ с одного ip
Доступ будет разрешен только с одного ip-адреса 172.111.222.55
order deny,allow deny from all allow from 172.111.222.55
3.4. Запретить доступ с разных ip
Запретить доступ к сайту с нескольких ip-адреса 172.112.222.55, 172.113.222.55, 172.114.*.*
<Limit GET POST PUT> order deny,allow deny from all deny from 172.112.222.55 deny from 172.113.222.55 deny 172.114.*.* </LIMIT>
3.5. Редирект в URL с больших символов на маленькие
Все большие буквы в адресе URL будут переведены на маленькие.
RewriteRule [A-Z] - [E=HASCAPS:TRUE,S=1] RewriteRule ![A-Z] - [S=28] 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 RewriteRule [A-Z] - [N] RewriteCond %{ENV:HASCAPS} TRUE RewriteRule ^/?(.*) /$1 [R=301,L]
301 Редирект .htaccess — полный обзор с примерами, опубликовано К ВВ, лицензия — Creative Commons Attribution-NonCommercial 4.0 International.
Респект и уважуха