Блог специалистов
21.12.2011

Работа с файлом htaccess.

Работа с htaccess файлом для оптимизатора просто одна из заповедей, но как и ко всему библейскому, тут нужен справочник :)

Собственно это ветка про этот чудо-файл и все касаемо его будет тут дополняться, чтобы потом не искать по всему сайту одну строчку кода.

1. Без www на с www.

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

1.1. C www на без www.

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

2. Убираем слеш в конце URL:

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

2.2. Добавляем слеш в конце URL:

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

3. Удаляем в конце URL расширение .html

REWRITECOND %{HTTP_HOST} ^domen.ru [NC]
REDIRECTMATCH 301 (.*)\.html$ http://www.domen.ru$1

4. 301 редирект с http://domen.ru/index.php на http://domen.ru/

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://domen.ru/ [R=301,L]

5. 301 редирект с одной директории на другую на одном и том же сайте

RewriteRule ^directory1/directory2/$ /directory1/directory3/ [R=301,L]

6. 301 редирект с одного домена на другой вместе со всеми URL

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

7. 301 редирект с одного домена 3-го уровня на другой домен 2-го уровня вместе со всеми URL

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

8. 301 редирект с директории без слеша на новую директорию со слешем

RedirectMatch 301 /old_folder/old_folder(.*) /new_folder/new_folder/$1

9. 301 редирект с адреса URL .html на адрес .html

Redirect 301 /news/r-17.html http://sait.ru/news/view/elektronnye_sigarety_denshi_tabaco.html

10. 301 редирект с адреса URL c GET запросом на адрес с .html (С http://sait.ru/index.php?dn=news&to=cat&id=9&Itemid=59 на http://sait.ru/news/view/elektronnye_sigarety_gamucci.html)

RewriteCond %{QUERY_STRING} (?<=(?<=^|&)dn=news)(?=&|$) [NC]
RewriteCond %{QUERY_STRING} (?<=(?<=^|&)to=cat)(?=&|$) [NC]
RewriteCond %{QUERY_STRING} (?<=(?<=^|&)id=9)(?=&|$) [NC]
RewriteCond %{QUERY_STRING} (?<=(?<=^|&)Itemid=59)(?=&|$) [NC]
RewriteRule ^index\.php$ /news/view/elektronnye_sigarety_gamucci.html? [NC,R=301,L]

11. Закрывающий слеш после URL без него, но без слеша, для страниц с окончанием .html

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{REQUEST_URI} !.html$
RewriteRule (.+) $1/ [R=301,L]

12. Подмена одного содержимого URL на другое без изменения в адресной строке mod_rewrite htaccess. Первая часть /stati/poleznye-shtuki/, это адрес URL который будет набран пользователем, вторая часть /poleznoe/ страница, которая отобразится по этому адресу, при этом в адресной строке так и будет /stati/poleznye-shtuki/.

RewriteRule ^stati/poleznye-shtuki/$ /poleznoe/ [P]

Можно показать даже страницу с другого сайта, при этом у пользователя в адресной строке ничего не изменится:

RewriteRule ^stati/poleznye-shtuki/$ http://другойсайт.ru/страница/ [P]

На HTTPS может не работать, это значит, что в настройка сервера на хостинге не указан в VirtualHost 443 порт, а только 80. Тогда нужно обратиться в тех.поддержку, чтобы они добавили или добавляем сами, если это выделенный сервер.

Часто приходится сталкиваться с параметрами mod_rewrite в квадратных скобках. Чтобы раз и навсегда их быстро находить, выделим в отдельную таблицу.

[R]
Redirect - останавливает процесс преобразования и возвращает результат браузеру клиента как редирект на данную страницу (код 302 - MOVED TEMPORARY), также можно указать код редиректа самостоятельно, например R=301 (код 301 - MOVED PERMANENTLY).
[F]
Forbidden - возвращает ошибку 403.
[G]
Gone - возвращает ошибку 410.
[P]
Proxy - дает команду Apache выполнть подзапрос к указанной странице с использованием программного модуля mod_proxy, при этом пользователь ничего не узнает об этом подзапросе. Если модуль mod_proxy отсутствует, то произойдет ошибка.
[L]
Last - останавливает процесс преобразования, и текущая ссылка считается окончательной.
[N]
Next - запускает процесс преобразования с первого по порядку правила.
[C]
Chain - объединяет несколько правил в цепочку. Если первое правило цепочки не срабатывает, то вся цепочка игнорируется.
[NS]
NoSubreq - разрешает срабатывание правила только для настоящих запросов, игнорируя подзапросы.
[NC]
NoCase - отключает проверку регистра символов.
[QSA]
Qsappend - добавляет исходные параметры запроса (query string) к замене. Если замена не включает в себя новые параметры запроса, то исходные параметры запроса добавляются автоматически. Если же включает, то без флага QSA исходные параметры запроса будут утеряны.
[PT]
PassThrough - останавливает процесс преобразования и передает полученную новую ссылку дальше по цепочке.
[S]
Skip - пропускает следующее правило, если данное правило сработало. Можно указать количество правил, например: S=2
[E]
Env - устанавливает переменную окружения, например: E=переменная:значение.

Количество показов: 3729




Возврат к списку