Настройка .htaccess. Полное руководство

08.06.2011

настройка htaccess

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

Сразу напомню, прежде чем что либо менять в htaccess — сделайте копию вашего рабочего файла в укромное место. Мало ли, резервное копирование вообще хорошая вещь, не забывайте об этом. Я разделю статью на несколько подразделов — перенаправление страниц, запрет доступа к определенным файлам, ускорение сайта и прочие штуки, которые так или иначе могут пригодиться в работе ресурса.

Для начала — пару слов, что такое htaccess? Процитирую официальный сайт веб-сервера Apache:

.htaccess файлы (или «распределенные конфигурационные файлы») позволяют задавать большое количество дополнительных параметров и разрешений для работы веб-сервера в отдельных каталогах (папках), таких как управляемый доступ к каталогам, переназначение типов файлов и т. д, без изменения главного конфигурационного файла.

То есть, мы можем управлять поведением сервера в каждой, отдельно взятой папке, что очень удобно.


Директивы htaccess. Перенаправление

Блокируем хотлинки с других сайтов

Есть нехорошие товарищи, которые могут использовать картинки с вашего ресурса для использования в своих проектах. Они используют ваши изображения на своих сайтах, другими словами, используют вашу пропускную способность в своих целях, по аналогии с перемещением изображений на поддомен. Будем с ними бороться… Заменим любую картинку, на которую ведет хотлинк с другого сайта, на какое-нибудь предупреждающее изображение или на что хватит фантазии. В коде не забывайте менять адреса на ваши URL.

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?ваш-урл\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
#Замените путь к картинке
RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/noHL.jpg [L]

Перенаправим RSS фиды WordPress на Feedburner

Я не думаю, что кто-то пользуется чем-то другим, отличным от Feedburner. Удобно для пользователя, удобно для владельца блога, статистика, опять же. Если вы еще не используете — крайне рекомендую. Код ниже перенаправит все ваши RSS потоки на ваш аккаунт, не забывайте только вставить нужный адрес.

RedirectMatch 301 /feed/(atom|rdf|rss|rss2)/?$ 
RedirectMatch 301 /comments/feed/(atom|rdf|rss|rss2)/?$ http://feedburner.com/yourfeed/

В этом примере идет перенаправление двух потоков: основного RSS и обновление комментариев, если посетитель подписан на обновления.

Изменим страницы ошибок

С хостингом и сайтом случается всякое, поэтому заранее нужно быть готовым к проблемам и сделать свои страницы ошибок. А пользователи в случае проблем будут перенаправлены на соответствующую страницу. На этих страницах можно дать краткую информацию для пользователя, почему такое случилось. Контакты свои оставить, в крайнем случае.

ErrorDocument 400 /errors/badrequest.html
ErrorDocument 401 /errors/authreqd.html
ErrorDocument 403 /errors/forbid.html
ErrorDocument 404 /errors/404.html
ErrorDocument 500 /errors/serverr.html
#Замените /errors/*.html на путь к вашим страницам ошибок

В этом примере идет перенаправление в случае основных ошибок. 404 я тоже добавил, хотя CMS обычно отрабатывают такие моменты, но бывали случаи.

301 и 302 редирект или перенаправление

301 редирект или, так называемое постоянное перенаправление — говорит о том, что страница поменяла адрес или URL и перенаправляет на новую страницу. Если у вас на сайте была проиндексированная ПС страница, а вы поменяли ее адрес — в обязательном порядке сделайте 301 редирект на новую страницу. При 301 редиректе старая страница не индексируется, а вместо нее «подставляется» новая.

RewriteEngine on
Redirect 301 /old-page http://ваш-урл.ру/new-page

Собственно, похожий пример внимательный читатель увидит выше, в случае перенаправления RSS. Да, технология та же.
Бывает так, что сайт переезжает на новый домен, нужно сохранить структуру ссылок, а их могут быть сотни и тысячи, на каждую установить перенаправление нереально. Код ниже поможет разобраться с такой ситуацией:

Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*)  [R=301,L]

Есть интересная методика «скрытия» внешних ссылок путем 301 редиректа. Допустим, у вас есть «сквозная» ссылка в сайдбаре, которая ведет на ваш профиль в Google+, она внешняя, то есть ведет на внешний ресурс. Для SEO очень хорошо, когда таких ссылок как можно меньше. Можно спрятать их и сделать внутренними.

Технология производства внутренних ссылок из внешних:

  • ставим ссылку на мнимую страницу, допустим gering111.com/google-plus
  • настраиваем 301 редирект в htaccess с этой страницы на реальную страницу вашего профиля
  • посетитель ничего не чувствует, ПС довольны

Подобным образом можно ставить любые другие условно постоянные ссылки. 
302 редирект или временное перенаправление говорит ПС, что страница перемещена временно, поэтому индексировать нужно обе страницы, старую и новую.

RewriteEngine on
Redirect 302 /old-page http://ваш-урл.ру/new-page

Код абсолютно такой же, как в случае с постоянным перенаправлением.
302 редирект удобно использовать, когда проводятся какие-либо долгосрочные работы на сайте и не нужно показывать посетителям «поломанные» страницы. В таком случае вам поможет этот код:

RewriteEngine on
RewriteCond %{REQUEST_URI} !/inside.html$
RewriteCond %{REMOTE_ADDR} !^123.123.123.123
RewriteRule $ /inside.html [R=302,L]

Склеиваем сайты с www и без него

Очень плохо, когда сайт доступен по двум адресам, ПС это очень не любят. Склеить это в один адрес поможет код ниже:

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.ваш-урл\.com$ [NC]
RewriteRule ^(.*)$ http://ваш-урл.com/$1 [R=301,L]

В этом примере — главное зеркало это адрес без www. Если необходимо сделать наоборот — поменяйте www местами, сверху уберите, внизу добавьте.

Показ страниц в зависимости от IP

SetEnvIf REMOTE_ADDR 192.168.0.1 REDIR="redir"
RewriteCond %{REDIR} redir
RewriteRule ^/$ /about.html

Добавлять адреса можно дублированием первой строки, в последней — меняется страница для перенаправления.

Перенаправляем на главную

Перенаправление со страниц site.com/index.php и site.com/index.html на страницу site.com/. За код спасибо Василию Красноженову.

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

Директивы htaccess. Разделяем доступы

Запрет доступа к сайту

Бывает такое, что необходимо запретить доступ посетителям с определенного IP, спамерам или еще кому нехорошему.

Order Allow,Deny
Allow from all
Deny from 192.168.0.1

Добавлять IP в список можно просто добавляя последнюю строку и меняя там адрес на нужный.
Противоположная ситуация, когда всем нужно запретить, кроме некоторых IP, тогда используем такой код:

Order Deny,Allow
Deny from all
Allow from 192.168.0.1

Добавлять адреса аналогично предыдущему примеру.

Запрещаем просмотр нежелательным User-Agent

Каждый браузер или приложение, которое запрашивает страницу, так или иначе имеет идентификатор — User-Agent. Можно запретить просмотр нежелательным товарищам. Это могут быть как программы, сканирующие сайты, так и старые браузеры, от поддержки которых вы целиком отказались. Ситуации бывают разные.

SetEnvIfNoCase user-Agent ^FrontPage [NC,OR]
SetEnvIfNoCase user-Agent ^Java.* [NC,OR]
SetEnvIfNoCase user-Agent ^Microsoft.URL [NC,OR]
SetEnvIfNoCase user-Agent ^MSFrontPage [NC,OR]
Order Allow,Deny
Allow from all
Deny from env=bad_bot

Полный список известных User-Agent вы можете найти на сайте http://www.user-agents.org/

Запрещаем доступ к определенному файлу

В примере стоит запрет на доступ к файлам wp-config и htaccess, тем самым повышается уровень общей защиты. Очень нужная директива, рекомендую добавить в свои файлы

# защищаем wpconfig.php
<Files wp-config.php>
order allow,deny
deny from all
</Files>
#защищаем htaccess
<Files .htaccess>
order allow,deny
deny from all
</Files> 

Аналогично можно защитить css и js файлы, которые используются плагинами:

<Files ~ "\.(js|css)$">
order allow,deny
allow from all
</Files>

Скачивание определенных типов файлов

Современные браузеры такие умные, что иногда становится страшно. Мой Хром иногда пытается внутри себя открывать для просмотра PDF файлы, иногда вешаясь насмерть. С помощью htaccess можно принудительно сказать браузеру, что делать с тем или иным типом файлов, не оставляя этот момент на его усмотрение. В данном случае это скачивание. Дополнительные типы файлов можно добавить по аналогии.

AddType application/octet-stream .pdf
AddType application/octet-stream .zip
AddType application/octet-stream .avi

Ограничение на доступ к админке WordPress

Если у вас постоянный IP адрес, можно только ему давать доступ к админ-панели WordPress

AuthUserFile /dev/null
AuthGroupFile /dev/null
AuthName "Example Access Control"
AuthType Basic
<LIMIT GET>
order allow, deny
deny from all
allow from Ваш IP
</LIMIT>

Директивы htaccess. Техническая оптимизация и ускорение

Запрещаем автоматическое индексирование файлов

В каждой папке на сайте Apache создает, по умолчанию, индексные файлы, в которых перечисляется, какие файлы в папке находятся. Если вы не хотите давать дополнительную лазейку для злоумышленников — запретите индексирование.

Options -Indexes

Включаем gzip сжатие

Вы знаете о том, что данные на сервере можно сжать, а клиент их распакует у себя? Код ниже как раз включает такую штуку. Нужно только убедиться, что gzip разрешен на вашем хостинге, но обычно он есть.

<FilesMatch "\.js.gz$">
ForceType text/javascript
Header set Content-Encoding: gzip
</FilesMatch>
<FilesMatch "\.css.gz$">
ForceType text/css
Header set Content-Encoding: gzip
</FilesMatch>
<FilesMatch "\.js$">
ForceType text/javascript
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} !".*Safari.*"
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME}.gz -f
RewriteRule (.*)\.js$ $1\.js.gz [L]
ForceType text/javascript
</FilesMatch>
<FilesMatch "\.css$">
ForceType text/css
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} !".*Safari.*"
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME}.gz -f
RewriteRule (.*)\.css$ $1\.css.gz [L]
ForceType text/css
</FilesMatch>

Код не работает для изображений, но к ним применять gzip не рекомендуется. Именно такой код установлен у меня.

Сжатие с применением mod_deflate

Ходят слухи, что с помощью этого мода сжимать данные лучше и сайт работает быстрее. Я не могу протестировать, да и не встречал в Интернете подобных тестов. Если у кого есть такая информация — буду благодарен. А код выложу, мало ли

<ifmodule mod_deflate.c="">
<filesmatch ".(js|css)$"="">
SetOutputFilter DEFLATE
</filesmatch>
</ifmodule>

Включаем кэширование браузера клиента

Интересная директива, которая позволяет использовать кэширование браузера. Указанные типы файлов записываются в кэш браузера и при повторном вызове будут грузиться оттуда, что существенно ускоряет общую скорость загрузки сайта и дает меньшую нагрузку на ваш хостинг.

Header append Cache-Control "private"
FileETag MTime Size
ExpiresActive On
ExpiresDefault "access plus 0 minutes"
ExpiresByType image/ico "access plus 1 years"
ExpiresByType text/css "access plus 1 years"
ExpiresByType text/javascript "access plus 1 years"
ExpiresByType image/gif "access plus 1 years"
ExpiresByType image/jpg "access plus 1 years"
ExpiresByType image/jpeg "access plus 1 years"
ExpiresByType image/bmp "access plus 1 years"
ExpiresByType image/png "access plus 1 years"

Указываем кодировку по умолчанию

WordPress работает с кодировкой UTF8 и делает это хорошо, но чтобы гарантированно избежать проблем с кодировкой — укажите ее принудительно, хуже не будет точно.

AddDefaultCharset UTF-8

Ограничиваем число подключений к сайту

Современные браузеры умеют создавать несколько одновременных подключений к серверу, отдающему сайт. Если же у вас маловато ресурсов, можно ограничить число подключений.

MaxClients <количество подключений>

При размещении в корневом каталоге, директива работает на весь сайт, если же положить ее в папку с файлами, которые вы отдаете на скачивание — можно ограничить скачивание в несколько потоков.

Разрешаем выполнение php внутри JavaScript

Иногда необходимо выполнить некоторый код внутри скрипта. Этот код поможет включить эту функцию

AddType application/x-httpd-php .js
AddHandler x-httpd-php5 .js
<filesmatch "\.(js|php)$">
SetHandler application/x-httpd-php
</filesmatch>

Вот и все, что касается htaccess и его стандартного использования. Я не стал упоминать о защите папок паролями, потому что не считаю это правильным, о «защите» от спама, путем блокировки запросов запросов без передачи Referer, потому что все современные спам-машины давно умеют это делать. Ну и прочие вещи, которые не считаю грамотно реализованными.

Напоследок хочу представить вам сервис тестирования вашего htaccess файла — http://htaccess.madewithlove.be/. Там все просто, удачного дня

follow us in feedly

,

Комментариев: 112

  1. Константин

    Вот все хорошо, только у меня сайт перенаправляет на страницу 404 а сервер при этом отдает код 200.
    Можете подсказать как исправить?

    Ответить
  2. Роман

    Подскажите, удалил раздел, +300 страниц, как сделать переадресацию со всех страниц раздела сайта на главную. Какой код, условие добавить кроме этого? RewriteRule ^raznoe(.*)$ / [L,R=301]

    Ответить
  3. Serge Holmberg

    Спасибо за статью. Очень полезная статья. Хотелось бы еще узнать дополнительно. А как сделать так, чтобы доступ в каталогах сайта возможен был тлько через index.html и не возможем напрямую? Поясняю. У меня в каталоге много взаимосвязанных страниц. Однако каждую по отдельности я могу запросить из браузера. Т.е. например есть странца page_1.html в каталоге main. Вход в нее идет от index.html (там есть кнопка). Однако загрузить страницу page_1.html я могу и отдельно обратившись http://www.mysite.com/main/page_1.html . Как это предотвратить, как сделать так, чтобы для посетителей сайта был доступен только index.html, а через него доступ и к другим страницам. То есть обмен между страничками был возможен только внутренне на сервере. Тогда посетители не смогут произвольно открывать любые страничеи на сайте. Заранее благодарен. Спасибо.

    Ответить
  4. Виктор

    Здравствуйте! Спасибо за статью! Сейчас как раз настраиваю свой первый ) сайт. Очень внимательно прочитал, ещё раз спасибо! Есть вопрос: по поводу защиты определённых типов файлов.
    Вы писали:
    «Аналогично можно защитить css и js файлы, которые используются плагинами:
    #<Files ~ "\.(js|css)$">
    #order allow,deny
    #allow from all
    #</Files>
    -конец цитаты
    В предпоследней строчке кода нет опечатки? Если мы хотим защитить эти файлы, может быть, там должно быть DENY? Или я чего-то не понимаю?

    Ответить
  5. plumclub

    Большое спасибо за статью, давно не встречал настолько внятного и понятного объяснения. Респект

    Ответить
  6. Андрей

    Хорошая статья! Спасибо!

    Есть вопрос.

    У меня есть старый сайт еще на .ASP, я решил его переделать, сменить тип Web-сервера, установить туда WordPress и соответственно пришлось убрать все старые страницы сайта т.к. под аппачем ASP не работает. Я не хочу, чтобы они вообще стали недоступными и сделал поддомен ( http://www.old.mysite.ru ) и перенес все старое туда и там все работает.

    Теперь надо сделать так, чтобы, если пользователь обращается к любой ASP-странице, его автоматически перенаправляло на поддомен http://www.old.mysite.ru т.е. перенаправление делать ТОЛЬКО для ASP страниц, остальные не перенаправлять.

    т.е. надо запросы типа: http://www.mysite.ru/любая_страница.ASP

    перенаправлять на: http://www.old.mysite.ru/любая_страница.ASP

    причем «www» — может быть или не быть в адресе

    Подскажите пожалуйста!

    Ответить
  7. Mike

    А как сделать перенаправление с site.ru на site.ru/url ?
    Нужно, чтобы вместо главной страницы открывалась определенная.
    Но при этом установлен движок ВП, на которым работают нужные плагины, а самого сайта (в смысле главной страницы) нет.

    Нужно, чтобы избежать следующего:
    Человек услышал название сайта, вбил его в поиске site.ru а ему открывается пустой шаблон ВП.
    Нужно, чтобы он когда вбли site.ru — ему открылась нужная мне ссылка.

    Ответить
  8. Владимир

    Спасибо, добрый человек. Очень выручил ваш сайт

    Ответить
  9. Стас

    Подскажите пожалуйста!
    RewriteRule ^([0-9]+)_([a-zA-Z0-9-]*) /manufacturer.php?id_manufacturer=$1 [QSA,L]
    как добавить, что бы не редиректил урлы с числами 15,23,25?

    Ответить
  10. elimelech

    У меня постоянно какой-то хакер заливает в корень сайта файл с расширением html — index.htm и содержанием: «Hacked By Moroccan wolf ~ Dz Team»
    Что делать? Как запретить заливать любые файлы в корень сайта?
    P.S: а зачем выставлять защиту на какой-то файл? Можно же просто права записать на него 0444

    Ответить
  11. Женя

    суть: имеется страница /novosti/408-novosti/10371-olimpiada-po-vebtehnologijam.html

    нужно чтоб она открывалась (и показывалась в адресной строке) с таким именем сайтru/novosti/231-vse-novosti/10371-olimpiada-po-vebtehnologijam.html

    нужно сменить имя каталога /408-novosti/ на /231-vse-novosti/ как прописать это в .htaccess заранее благодарю.

    Ответить
  12. Александр

    Здравствуйте,
    У меня вопрос, буду очень благодарен за помощь,
    У меня сайт партнерка itunes, автоматически публикуются на сайте приложения для iPad, iPhone.
    Одно из приложений публикуется на сайте каждый час почти по 10 и более раз, как можно заблокировать данное приложение, что бы оно не публиковалось на сайте.
    спасибо
    Александр

    Ответить
  13. Евгений

    Здравствуйте. Последний ап выдачи сотворил следующее: страницы вида:
    /index.php?module=pages&id=102 в выдаче стали такими:
    /index.php?id=102&module=pages
    появились дубли, позиции порядком просели.
    Можно с помощью .htaccess настроить 301 редирект регулярными выражениями?
    За помощь готов отблагодарить материально, помогите — очень надо =)

    Ответить
  14. Andrey

    Есть старый не нужный сайт, но в индексе. Надо сделать редирект на другой сайт. т.к. структура отличается, надо редиректить только на домен, иначе на другом сайте 404 ошибки полезут. Можно ли это реализовать. Доступ есть к обоим сайтам.

    Ответить
  15. Александр

    Не могу найти, как в .htaccess определить время создания и модификации определенного файла, например aaa.txt, и, в зависимости от прошедшего времени, производить действия.
    Например, если после создания aaa.txt прошло полчаса, делать редирект.
    Не подскажете, как это можно сделать?

    Ответить
  16. specteh

    Статей на тему htacess в рунете много, но эта, как по мне, самая полная )) Спасибо автору за сайт, много полезного, так держать!

    Ответить
  17. Артур

    Добрый день. У меня такая проблема, я создаю заявки и сохраняю их на сервере в админ части, которая закрыта от доступа паролем, доступ есть только если ввести логин пароль AuthUserFile. Вроде все норм файлы и страницы закрыты, но если вводить путь к файлам txt, то открывается файл и ее содержимое видно. Не знаю как закрыть ее. Разрешить доступ только авторизованным администраторам. Заранее спасибо.

    Ответить
  18. Юрий Игнатов

    Доброго дня!
    Подскажите, пожалуйста, чайнику.
    Есть такая структура урлов — http://сайт.ru/?page=2
    Файл .htaccess пустой. Что в нем написать, что при изменении в урле ?page=3 менялись страницы сайт (контент)?
    Благодарю за подробное ответ! CMS нет.

    Ответить
  19. Tim Olien

    Хотелось бы узнать что делать если сайт открывается сайт/#/ соответсвенно при попытке убрать index.php — убирается но открывается в следующем формате сайт.ру/#/index.php Вообще как убрать решетку? Так как похоже для всех страниц создаются дубли?

    Ответить
  20. Robogen

    Спасибо за статью, почитал с удовольствием. Правда, за свой htaccess пока взяться никак не могу, времени не хватает ))

    Ответить
  21. Karchevei

    Добрый день. Огромное спасибо вам за статью и в целом за ваш сайт. Случайно зашел и залип, изучаю третий день ))

    Ответить
  22. Tina

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

    Ответить
  23. Andrews32

    Спасибо за материал, ваша статья самая лучшая по этой теме. Вопрос по абзацу «Блокируем хотлинки с других сайтов»: а будут ли в этом случае картинки свободно отдаваться Яндекс- и Гугл-картинкам?

    Ответить
    • GerinG

      Тут больше вопрос к сеошнику, чем к программисту )) Но, думаю что проблем быть не должно.

      Ответить
  24. Andrews32

    И второй вопрос: нужно ли в строке
    RewriteCond %{HTTP_REFERER} !^http://(.+.)?ваш-урл.com/ [NC]
    добавлять www, если сайт отдаётся с ним?
    Правило прописал, а не работает (например,

    Ответить
    • GerinG

      Принцип работы этого кода — замена картинки, если адрес ссылающегося сайта отличен от вашего.
      Возможно, неправильно указали ссылку на картинку заменитель?
      Вот тут подробно разобрана эта проблема, правда на английском — http://altlab.com/htaccess_tutorial.html. Плюс, есть инструмент тестирования

      Ответить
  25. Алексей

    Привет!
    У меня сайт на Joomla
    пробовал и ваш код и такой:
    RewriteCond %{HTTP_HOST} ^www.sait.ru
    RewriteRule ^(.*)$ [R=301,L]
    При проверке сайт так же работает и с www
    Папку под названием htaccess.txt
    По советам меняю на .htaccess
    и тогда выдается ошибку: 500 Server error.
    В общих настройках Joomla ставлю ДА на Перенаправление URL
    но все равно сайт выдает ошибку после изменения названия папки!

    Ответить
  26. Favor

    Спасибо. довольно удобоваримо расписано. Неплохо структурировано.

    Ответить
  27. Вячеслав Мазуров

    Прошу специалистов работы с htaccess написать мне в скайпе
    Есть платное задание. Убедительная просьба ответить тех, кто хочет подзаработать, и может прописать то, что мне понадобится.
    Выходите в скайп ко мне и там я всё покажу.

    Ответить
    • GerinG

      Тут не доска бесплатных объявлений, поймите меня правильно, поэтому оффтопить не нужно

      Ответить
    • GerinG

      Я не совсем понимаю, для чего это нужно. В вашем примере вы даете вторую ссылку с закрытым слешем адреса, собственно и открывается главная страница с параметром, соответственно — 200 ОК.
      Объясните, для чего отдавать 404?

      Ответить
    • GerinG

      Я не уверен, что вам необходимо клеить. Укажите на одной из страниц запрет индексации и все

      Ответить
  28. zeleniyalex

    Здравствуйте.
    Спасибо за статью, отличный материал, добавил в закладки.
    У меня вопрос. Перешел на указанный Вами сервис проверки htaccess файла.

    Ввёл свой:
    # BEGIN WordPress

    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ — [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]

    # END WordPress

    Получил вот такой результат:
    # BEGIN WordPress
    1
    2 RewriteEngine On
    3 RewriteBase /
    4 RewriteRule ^index\.php$ — [L]
    5 RewriteCond %{REQUEST_FILENAME} !-f ——————— This variable is not supported: %{REQUEST_FILENAME}
    6 RewriteCond %{REQUEST_FILENAME} !-d ——————— This variable is not supported: %{REQUEST_FILENAME}
    7 RewriteRule . /index.php [L], ——————— This rule was not met because one of the conditions was not met
    8
    9 # END WordPress

    Что значат комментарии к пунктам 5,6,7 ?
    Спасибо.

    Ответить
  29. Anti Out

    Виктор, подскажите, пожалуйста, чтобы сделать склейку, нужно вписать url своего сайта, суть в чем, я не пойму .com в самой директиве меняется или остается?
    Какой вариант правильный (на примере Вашего сайта)?

    Options +FollowSymLinks
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^www.gering111.com\.com$ [NC]
    RewriteRule ^(.*)$ http://gering111.com.com/$1 [R=301,L]

    Options +FollowSymLinks
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^www.gering111\.com$ [NC]
    RewriteRule ^(.*)$ http://gering111.com/$1 [R=301,L]

    Ответить
    • GerinG

      Второй вариант верный, gering111.com для примера. В вашем случае может быть site.ru или site.org

      Ответить
  30. Олег

    Мегаполезная статья!!!
    Но, кеширование файлов у клиента — не Cache-Control «public», а Cache-Control «private».
    Public — на прокси-сервере

    Ответить
  31. Александр

    Здравствуйте!
    Был сайт вида site.ru/club/ Нужно сделать редирект всех страниц этого сайта на одну страницу нового примерно вот такой структуры: new-site.ru/step/stranica.html.
    Подскажите пожалуйста как это правильно сделать через htaccess?

    Ответить
  32. Михаил

    Доброго времени суток. Хотел предупредить, что использование этого кода
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html\ HTTP/
    RewriteRule ^index\.html$ http://site.com [R=301,L]
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
    RewriteRule ^index\.php$ http://site.com [R=301,L]
    может закрыть доступ в админ панель сайта, у меня так было с CMS ShopScript, и VamShop

    Ответить
    • GerinG

      Я использую этот код с WP, ImageCMS — все ок, никаких проблем. Собственно, на других системах не тестировал, ничего не скажу.

      Ответить
  33. Михаил

    Вопрос по редиректу.
    Необходимо перенаправлять на одну страницу, если заходим с браузера, но на другую, если с мобильного приложения (не моб. браузера). При этом в обоих вариантах персоначальная ссылка на корень сайта.

    Например: http://xxx.ru. Если зашли с компьютера, то станет . Если же запрос послали через моб. приложение, то .

    Буду рад совету.

    Ответить
  34. Денис

    Спасибо за статью. Использую редирект

    Options +FollowSymLinks
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^www.site.com$ [NC]
    RewriteRule ^(.*)$ http://site.com/$1 [R=301,L]
    Во всех браузерах, кроме ie, редирект работает. Но вот в ие если в адресную ввожу http://www.site.com — выдает ошибку, что не нашел страницу. А вот если http://site.com — то все норм, может сталкивались с подобной проблемой

    Ответить
  35. Вова

    Добрый день! Я точно не знаю, в тему ли я. Есть сайт на CMS Sharetronix — katalog.vv.si. Люди могут там регистрироваться и постить, в постах кида.ют свои ссылки — нужно чтоб на все их ссылки автоматом ставился редирект, ато меня опять спаммом забросают.
    Готового модуля не нашел, а вот с готовыми решениями не могу разобраться — в большинстве решений в ссылку нужно самомстоятельно индекс порписывать, но мне это не за чем. Мне нужно, чтоб редиректились и те, что их другие юзеры кидают..

    Ответить
    • GerinG

      Судя по вашему объяснению, из которого я мало что понял — вам нужно искать что-то вроде модуля для своей CMS, чтобы он переписывал любые ссылки. htaccess в вашем случае неприменим, в том смысле, в котором он описывается здесь.

      Ответить
  36. Анастасия

    Здравствуйте! Подскажите, если кто может, как сделать так, чтобы из УРЛа убрать .html и чтобы был закрывающий слэш. Дело в том, что по отдельности это я могу сделать, а вот сразу вместе — нет. Так как на этом сайте в адресной строке.

    Оставила только начало в .htaccess, чтобы был постоянный переход на адрес с WWW.

    —————————-

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^ronfx.com$ [NC]
    RewriteRule ^(.*)$ [R=301,L]

    —————————-

    Помогите, если кто понимает и кому не влом. Настя.

    Ответить
    • GerinG

      У меня в настройках постоянных ссылок стоит — /%postname%/
      И все работает отлично. Попробуйте у себя также — WP сам создает в таком случае код htaccess

      Ответить
  37. Vitaliy

    Здравствуйте, возник такой вопрос. Можно ли в файле .htaccess помечать для чего предназначен код?
    например:
    #доступ к wp-admin
    AuthUserFile /dev/null
    AuthGroupFile /dev/null
    AuthName “Example Access Control”
    AuthType Basic

    order deny,allow
    deny from all
    allow from xx.xx.xx.xx

    #Перенаправление с rss

    RewriteEngine on
    RewriteCond %{HTTP_USER_AGENT} !FeedBurner [NC]
    RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
    RewriteRule ^feed/?([_0-9a-z-]+)?/?$ httр://feeds2.feedburner.com/wordpress[R=302,NC,L]

    И как это лучше прописать чтобы не повлияло на работоспособность кода?

    Ответить
    • GerinG

      Да вы, собственно, уже правильно и написали. Диезом отделяются комментарии

      Ответить
  38. Tim Olien

    Скажите пожалуйста, а в случае когда поменяли движок сайта, как правильно настроить редирект — у вас написано

    2
    3
    4
    RewriteEngine on
    RewriteCond %{REQUEST_URI} !/inside.html$
    RewriteCond %{REMOTE_ADDR} !^123.123.123.123
    RewriteRule $ /inside.html [R=302,L]
    Соответственно, я так понимаю надо вместо inside.html вставить свою страницу. А если страниц много? Что в данном случае делать как правильно настроить редирект для большого колличества страниц?

    Ответить
  39. Partner

    Отличный пост, все разложено по полочкам.
    Только не могу понять, как организовать редирект ссылки вида: /?ref=7777 на главную страницу?
    Бар показывает у данной страницы пр3, а у основного домена пр2, никак не могу сделать перенаправление.

    Ответить
  40. Василий

    Вопрос по файлу .htaccess:

    Имеется сайт http://www.сайт.ru
    в директории http://www.сайт.ru/dir — еще один сайт.
    в директории http://www.сайт.ru/dir/forum — еще один сайт (форум).

    Возможно ли используя файл или файлы .htaccess (имеющихся сайтов), сделать чтобы форум http://www.сайт.ru/dir/forum работал по адресу несуществующей директории http://www.сайт.ru/forum

    Ответить
  41. praktik_man

    Всюду лишь общие описания HTACCESS ,а настоящих примеров мало, также неплохо было бы и синтаксис описать, что с чем используется.

    Ответить
  42. praktik_man

    Может поможетете, если кто-то знает ответ?
    Есть каталог

    http://сайт.ru/catalog.php/(куча разных старниц)
    и чтобы перекидывало с любового введенного адреса, который начинается с catalog.php на:

    http://сайт.ru/products/10
    и ничего больше не дописывало. тоесть чтобы просто редиректило на директорию.

    Пробовал через RedirectMatch ^catalog\.php(.+) http://сайт.ru/products/10
    Так не работает ((

    Ответить
  43. GerinG

    Пока помочь не могу, далеко от компьютера. На первый взгляд — все ок. Скорее всего, в синтаксисе проблема, но надо проверить

    Ответить
  44. praktik_man

    Помогите пожалуйста.
    У меня ссылка была в виде:
    /сайт.ru/content/название товара, а теперь сайт.ru/новая папка/название товара.html

    тоесть поменялась и папка и расширение страницы, а название товара осталось прежним.

    Делал редирект в виде:
    RewriteRule ^content/(.+)$ http://сайт.ru/новая папка/$1.html [R=301,L]
    И не работает ;(
    В чем проблема?

    Ответить
  45. Евгений

    Немного непонятный вопрос в последнем комментарии, не смотрите туда так будет проще.)
    Автору статьи респект, отлично, грамотно, доходчиво!

    Ответить
  46. GerinG

    Автолюбитель — ссылки могут быть закрыты от индексации(обычно так и бывает) и нагрузку на ваш хостинг никто не отменял

    Ответить
  47. Автолюбитель

    «Блокируем хотлинки с других сайтов» А зачем это закрывать, это же ссылка на сайт?

    Ответить
  48. Виталий

    Я так понимаю что компонент AlphaRegistration отправляет какойто запрос с участием index.php, а htaccess отправляет его на редирект ,но одно странно если входить в систему не с главной то нормально )) Но пока закоментировал строки …

    Ответить
  49. GerinG

    Виталий — я в Джуми ни в зуб ногой, поэтому боюсь что не смогу помочь вам.

    Ответить
  50. Виталий

    Добрый день. Прописал на сайте (сайт на Джумле 1.5):
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
    RewriteRule ^index\.php$ http://bonus.lg.ua [R=301,L]
    все работает нормально, но теперь если находится на главной не пускает залогинется, просто перегружает главную, если зайти на другую страницу то залогинется дает. А выйти невозможно. Установлен AlphaRegistration

    Ответить
  51. iFFgen

    Вот за что за что, а за вот эти моменты с .htaccess огромное спасибо.
    Понадергал себе на вооружение.

    Ответить
  52. jey

    Добрый день, помогите, не могу определиться!
    есть сайт который имеет около 20-ти страниц, типа http://www.sait.ru/produkt.html
    все страницы находятся в корневом каталоге в формате HTML , но когда нужно что то менять на сайте, например номер телефона, то приходится редактировать все страницы сайта.
    поэтому решил создать базу данных на PHP-mysql.
    но страницы удается назвать в PHP-mysql. только таком виде
    типа http://www.sait.ru/produkt/
    програма php установлен на хостинге PHP5.2.10 и rewrite_module включен.
    требуется профессиональный помощи.
    как правильно настроит редирект от старых адресов типа produkt.html на новые адреса, типа /produkt/ при этом сохранить все возможные привилегии от поисковиков?.
    старые адреса типа produkt.html , будут удалены из корневого каталога, сразу после создании в базе данных новых адресов, типа /produkt/ .
    пожалуйста, еще вопрос: если будут меняться названии страницы таким образом
    например
    produkt.html превратится на /produkt/
    catalog.html превратится на /catalog/
    (их 20штук и все они разные)
    то можно написать редирект один раз для всех страниц ? или же придется писать для всех страниц по отдельности ?

    Возник еще вопрос тоже немало важный.
    почему то когда открываешь в строке поиске любые страницы, которая нет в базе данных, открывается шаблон страницы без контента
    пример
    типа http://www.sait.ru/pro/ или же типа http://www.sait.ru/drt/
    в общем если написать любое слово или несколько любых букв между слешами, открывается шаблон без контента,
    еще пример для динамических сайтов
    http://www.sait.ru/index.php?page=1000
    если на место 1000 написать любые цифры которая не находится в базе данных, открывается также пустой шаблон сайта.
    вопросы :
    1.эти моменты на сколько негативно влияет на раскрутку сайта ??
    2.можно ли настроить хтаксес так, чтобы при поиске этих страниц открывались 404 ошибка ??
    3. Или же эти проблемы не решается через файл хтаксес?

    Заранее спасибо !

    Ответить
  53. GerinG

    Вот это точно должно помочь

    Options +FollowSymLinks
    RewriteEngine on
    RewriteRule (index.php) [R=301,L]

    Ответить
  54. Владимир

    Сайт на joomla, новый сайт заказчика с кучей страниц, поэтому в ручную не один день займёт!

    Ответить
    • GerinG

      По идее — должна помочь вот такая конструкция

      RewriteEngine on
      RewriteRule ^/index.php(.*) $1 [PT]

      Это обычное удаление ненужного префикса

      Ответить
  55. Владимир

    хочу его убрать, но хотелось бы сделать и редирект, например:
    с http:// сайт .ru/index.php/cat/statyi
    на http:// сайт .ru/cat/statyi
    Подскажите, как сделать грамотно через RewriteRule.

    Ответить
    • GerinG

      У вас WordPress? Не пробовали посмотреть его настройку ЧПУ? У меня частенько бывало, что движок добавляет index.php в структуру ссылки.
      Гляньте, если не там проблема, подумаем дальше

      Ответить
  56. Дмитрий

    Здравствуйте!
    Подскажите, пожалуйста, как с помощью htaccess на «лету» убирать из ссылки определенный текст?
    К примеру, мне надо из ссылки
    «http://www…….ru/index.php?page=shop.product_details&product_id=150&flypage=yagendoo_VaMazing_zoom2.tpl&pop=0&o…….»
    убрать вот это: «&flypage=yagendoo_VaMazing_zoom2.tpl»

    Заранее благодарен!

    Ответить
    • GerinG

      Думаю, htaccess вам не поможет. Тут надо копаться в движке и смотреть, как формируется ссылка.

      Ответить
  57. Наталья

    Спасибо автору за статью, у меня взломали хостинг, и 4 сайта полетело, с помощью этой статьи только смогла разобраться как вылечить все!

    Ответить
    • GerinG

      Я рад, что у вас все получилось и моя статья смогла вам помочь Пусть больше не будет взломов

      Ответить
  58. Виктория

    Очень полезная статья, спасибо, проверила почти все директивы у себя на сайте, но вот включение кэширования браузера клиента вызвало 500 ошибку сервера.

    Ответить
  59. It-kyzylorda

    Здравствуйте! хочу скрыть ссылку в адресной строке браузера! как это сделать подскажите плиз! за ранее спс! Респект автору!

    Ответить
    • Виктор Милашечкин

      Скрыть строку не получится, тут работает не сайт, а браузер посетителя. Можно только вместо страницы А подсовывать страницу Б. Но это не то, что вам нужно, насколько я понял

      Ответить
  60. Moda

    а можно сделать так, чтобы  индексная страница(index.php) открывалась только с урлов данного сайта)  то есть заходит чел с улицы и попадает на индексную страницу  hello.php,   а кликнул по сцылке -ГЛАВНАЯ СТРАНИЦА — и попал на вторую индексную страницу index.php ?  — как наверное уже догадались такое для блога применимо, так как в корне index.php — используется движком)   ???

    Ответить
    • Виктор Милашечкин

      Я в целом понял, но зачем городить это через htaccess. Тем более, это очень трудно реализовать (я вообще сомневаюсь, что  возможно) Для таких целей используют плагины, которые отслеживают, откуда чел зашел и подсовывают то, что нужно.

      Ответить
  61. xppx

    Здравствуйте, полезная статья, подскажите мне решение такой проблемы. Недавно произвёл склейку сайтов, но появилась проблема, на старом домене нужна одна страница без редиректа через htaccess, т.е. чтоб одна страница непереадресовывала на новый домен, можно добавить какое то исключение в htaccess и если можно то какое. Извиняюсь если мой вопрос вам покажется слегка запутанным.

    Ответить
  62. BlogAdmin

    Очень подробно, отлично, спасибо.
    Особенно мне пригодится запрет по IP, ато спамеры сегодня атакуют.
    В закладки, плюсанул, твитнул.

    Ответить
  63. aldous

    Хороший мануал, но я давно избавился от апача на vds — непозволительная роскошь.

    Ответить
      • Дмитрий

        У меня с основания сайте все страницы с index.php и я хочу его убрать, но хотелось бы сделать и редирект, например:
        с http:// сайт .ru/index.php/cat/statyi
        на http:// сайт .ru/cat/statyi
        Подскажите, как сделать грамотно через RewriteRule.

        Ответить
  64. Игорь Викторович Лаптев

    Пост очень полезный, спасибо автору за подробную анатомию

    Ответить