Конфигурационный файл .htaccess является конфигом для веб-серверов на Apache. Большинство хостингов работают через этот сервер, поэтому на каждом сайте присутствует этот файл. Вебмастера могут частично управлять его работой, внося в него изменения. В этой статье мы рассмотрим директивы и правила, которые можно менять в работе сервера.
1. Правила Redirect, RewriteRule и RewriteCond
1.1. Директива Redirect
1.2. Директива RewriteRule
1.3. Директива RewriteCond
1.4. Директива RedirectMatch
2. Примеры 301 редиректов в .htaccess
2.1. Редирект с одной страницы на другую
2.2. Редирект со всех файлов .htm на .html
2.3. Редирект всего каталога на другую страницу
2.4. Удаление лишних слэшей в адресе URL
2.5. Реврайт без редиректа
2.6. Простанавка замыкающего слеша в конце адреса главной страница
2.7. Удаляем директорию каталога из URL
2.8. GET параметр
2.9. Редирект на мобильную версию сайта m.site.ru
2.10. Редирект с поддомена
3. Другие примеры с htaccess
3.1. Запретить IP-адрес и браузер
3.2. Запретить конкретный файл
3.3. Разрешить доступ с одного ip
3.4. Запретить доступ с разных ip
3.5. Редирект в URL с больших символов на маленькие
Самый главный файл .htaccess располагается в корне сайта:
http://site.ru/.htaccess
Его действия распространяются на текущий каталог и на все вложенные каталоги. У владельцев сайтов есть возможность воздействовать только на работу своего проекта, не мешая работе всего сервера. Если этот файл отсутствует, то его можно создать с помощью любого блокнота. Главное, чтобы название файла было ".htaccess" - без форматов .txt, .doc и т.д. Не забудьте про точку спереди.
Через файл .htaccess чаще всего настраивают 301 редиректы на уровне сервера, что сильно ускоряет процесс перехода на новую страницу, поскольку не надо загружать промежуточную страницу. Также здесь прописывается какой файл обрабатывает 404 ошибку (404 Not Found).
Чуть ниже мы рассмотрим все распространенные варианты редиректов через .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 https://site/newpage.php
Можно также писать по другому:
RedirectPermanent 301 /oldpage.php https://site/newpage.php или Redirect permanent 301 /oldpage.php https://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 https://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 ^(.*)$ https://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]
Читайте также:
• Как узнать видимость сайта
• Как сделать 404 ошибку
• Как сделать файл robots.txt
• Как добавить социальные кнопки на сайт
• Тег noindex и rel="nofollow"
• Сайт с www или без www
• Как определить хостинг сайта