301 Редирект .htaccess — полный обзор с примерами

Конфигурационный файл .htaccess является конфигом для веб-серверов на Apache. Большинство хостингов работают через этот сервер, поэтому на каждом сайте присутствует этот файл. Вебмастера могут частично управлять его работой внося в него свои изменения. В этой статье мы рассмотрим директивы и правила, которые можно менять в работе сервера.

Оглавление

  1. Правила Redirect, RewriteRule и RewriteCond
    1. Директива Redirect
    2. Директива RewriteRule
    3. Директива RewriteCond
    4. Директива RedirectMatch
  2. Примеры 301 редиректов в .htaccess
    1. Редирект с одной страницы на другую
    2. Редирект со всех файлов .htm на .html
    3. Редирект всего каталога на другую страницу
    4. Удаление лишних слэшей в адресе URL
    5. Реврайт без редиректа
    6. Простанавка замыкающего слеша в конце адреса главной страница
    7. Удаляем директорию каталога из URL
    8. Редирект GET параметров
    9. Редирект на мобильную версию сайта m.site.ru
    10. Редирект с поддомена
  3. Другие примеры с htaccess
    1. Запретить IP-адрес и браузер
    2. Запретить конкретный файл
    3. Разрешить доступ с одного ip
    4. Запретить доступ с разных ip
    5. Редирект в URL с больших символов на маленькие

Самый главный файл .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 в статьях:

Здесь мы дополним варианты редиректов, которых еще не было.


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]
Print Friendly, PDF & Email

CC BY-NC 4.0 301 Редирект .htaccess — полный обзор с примерами, опубликовано К ВВ, лицензия — Creative Commons Attribution-NonCommercial 4.0 International.


Респект и уважуха

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