Работа с .htaccess

Содержание

  1. Работа с .htaccess
  2. Редирект .htaccess
  3. Запрещение доступа в конкретную директорию
  4. Определение кодировки
  5. Пароль на директорию
  6. Свои страницы ошибок
  7. Индексация директорий и поддиректорий
  8. Защита изображений
  9. Обращения к robots.txt
  10. PHPSESSID
  11. Директивы кеширования
  12. Работа php в html
  13. Поддомены для пользователей
  14. Повреждение бинарного файла
  15. Ошибка SWF файлов
  16. Склейка страницы (301)
  17. Загрузка файлов вместо открытия
  18. Сжатие страниц
  19. Междоменные шрифты для FF
  20. PHP в JavaScript
  21. Блокируем User Agents
  22. Переадресация по языку
  23. Переадресация с http на https



.htaccess (с точкой в начале имени) — это файл-конфигуратор Apache-серверов, который дает возможность настройки работы сервера в отдельных директориях (папках), не предоставляя доступа к главному конфигурационному файлу. Например, устанавливать права доступа к файлам в директории, менять названия индексных файлов, самостоятельно обрабатывать ошибки Apache перенаправляя посетителей на специальные страницы ошибок. .htaccess представляет собой обычный текстовый документ с расширением htaccess. Данный файл обычно находится в корне сайта, однако вы можете создавать и дополнительные .htaccess-файлы для различных директорий вашего сайта.

Mod_rewrite — модуль, используемый веб-серверами для преобразования URL'ов.



Простой редирект

Redirect 301 / http://www.domainname.ru/

Ставится в файле .htaccess . / и означает, что всё с верхнего уровня сайта, включая все подкаталоги, будет переадресовано (не забывайте поставить последний /). Если вы хотите переадресовать только страницу, сохранив PR старой страницы, можно сделать так:

Redirect 301 /old/old.htm http://www.you.ru/new.htm

где:

/old/old.htm — путь и имя старой страницы,
http://www.you.com/new.htm — новый путь и новое имя перемещенной страницы.

Редирект на любую страницу по ip пользователя или при запросе конкретной страницы (а также по маске имени)

Если у пользователя ip 192.152.37.125, то он будет перенаправлен на страницу user.php:

  SetEnvIf REMOTE_ADDR 192.152.37.125 REDIR="redir"
  RewriteCond %{REDIR} redir
  RewriteRule ^/$ /user.php

Редирект при запросе определённых файлов
Если запрашиваются файлы, расширение которых не указано в файле .htaccess (gif и jpg), то следует перенаправление:

  RewriteEngine On
  RewriteRule !.(gif|jpg)$ index.php

Использование mod_rewrite

  Options +FollowSymLinks
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^yourdomain\.ru
  RewriteRule ^(.*)$ http://www.yourdomain.ru/$1 [R=permanent,L]

Редирект с регулярным выражением

  RedirectMatch 301 (.*) http://www.yourdomain.ru$1 

Прописывается в файле .htaccess.

(.*) RedirectMatch фактически соответствует регулярным образцам выражения после доменного имени. Таким образом, нельзя выполнить соответствие образца на ^/yourdomain.ru. Однако, можно преобразовать страницы с использованием .html расширения к файлам того же самого названия, но с .php расширением:

RedirectMatch 301 (.*)\.html$ http://www.yourdomain.ru$1.php

Если необходимо сделать различное перенаправление для отдельных страниц, можно использовать следующее:

  RedirectMatch Permanent ^/html/resources.html$ http://www.newdomain.com/resources.php
  RedirectMatch Permanent ^/html/other_page.html$ http://www.newdomain.com/other_page.php
  RedirectMatch Permanent ^/(.*)$ http://www.newdomain.com/

RedirectMatch Permanent — это эквивалент «RedirectMatch 301», строка с *(Wildcard) должна быть последней в этом списке.

Создание удобно читаемых URL

Чтобы преобразовать, например, www.site.ru/product.php?id=123 в www.site.ru/product/123 поступите следующим образом:

  RewriteEngine on
  RewriteRule ^product/([^/\.]+)/?$ product.php?id=$1 [L]

В следующем примере преобразуем www.site.ru/script.php?product=123 в www.site.ru/cat/product/123/:

  RewriteRule cat/(.*)/(.*)/$ /script.php?$1=$2

Редирект на PHP

  header("HTTP/1.1 301 Moved Permanently");
  header("Location: http://www.newdomain.ru/newdir/newpage.htm");
  exit();

Надо создать страницу при обращении к которой будет происходить редирект и разместить её на сервере. Лучше укажите HTTP/1.1 (а не HTTP/1.0 или HTTP/0.9, которые не поддерживают виртуальный хостинг).

Редирект всех файлов в папке на один файл

Например вы больше не нуждаетесь в разделе сайта Super discount и хотите перенаправить все запросы к папке /superdiscount на один файл /hot-offers.php. Для этого добавляем в .htaccess следующий код:

  RewriteRule ^superdiscount(.*)$ /hot-offers.php [L,R=301]

Редирект всей папки кроме одного файла
В следующем примере все файлы из папки /superdiscount будут редиректится на на файл /hot-offers.php, КРОМЕ файла /superdiscount/my-ebook.html который должен редиректится на /hot-to-make-million.html

  RewriteRule ^superdiscount/my-ebook.html /hot-to-make-million.html [L,R=301]
  RewriteRule ^superdiscount(.*)$ /hot-offers.php [L,R=301]

Редирект динамического URL на новый файл

Данный вариант пригодится, если вы хотите редиректить динамический URL с параметрами на новый статический файл.

  RewriteRule ^article.jsp?id=(.*)$ /latestnews.htm [L,R=301]

То есть теперь, запрос к файлу вида http://www.kass.ws/article.jsp?id=8632 и/или http://www.kass.ws/article.jsp?id=1245 будет отправлен на файл http://www.kass.ws/latestnews.htm.

Массовый редирект новых файлов

Теперь перейдем к самому сложному моменту, когда вам надо редиректить массу URL-ов, например после смены вашей CMS.

Тут сразу возникает ряд проблем: во-первых, внесение всех изменившихся адресов в .htaccess файл займет очень много времени, да и само по себе занятие малоприятное.

Во-вторых, слишком много записей в .htaccess файле будут тормозить Apache сервера.

И в-третьих, при внесении такого количества информации высока вероятность, что вы где-то ошибетесь.

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

Предположим, вы перешли на новую систему ссылок на вашем сайте и все файлы оканчивающиеся на старый id должны быть средирекчены. Сначала создаем в базе таблицу, которая содержит старый id и новый URL для редиректа. old_id INT new_url VARCHAR (255) Далее пишем код который свяжет ваши старые id с новыми URL-ами

После этого, добавляем следующую строчку в .htaccess:

  RewriteRule ^/product-(.*)_([0-9]+).php /redirectold.php?productid=$2

затем создаем PHP-файл redirectold.php, который будет поддерживать 301 редирект:

  <?php
  function getRedirectUrl($productid) {
  // Connect to the database
  $dServer = "localhost";
  $dDb = "mydbname";
  $dUser = "mydb_user";
  $dPass = "password";

  $s = @mysql_connect($dServer, $dUser, $dPass)
  or die("Couldn't connect to database server");

  @mysql_select_db($dDb, $s)
  or die("Couldn't connect to database");

  $query = "SELECT new_url FROM redirects WHERE old_id = ". $productid;
  mysql_query($query);
  $result = mysql_query($query);
  $hasRecords = mysql_num_rows($result) == 0 ? false : true;
  if (!$hasRecords) {
  $ret = 'http://www.yoursite.com/';
  } else {
  while($row = mysql_fetch_array($result))
  {
  $ret = 'http://www.yoursite.com/'. $row["new_url"];
  }
  }
  mysql_close($s);
  return $ret;
  }

  $productid = $_GET["productid"];
  $url = getRedirectUrl($productid);

  header("HTTP/1.1 301 Moved Permanently");
  header("Location: $url");
  exit();
  ?>

Теперь все запросы к вашим старым URL-ам будут вызывать redirectold.php, который найдет новый URL и вернет 301 ответ с вашей новой ссылкой.

Редиректы в зависимости от времени

Когда нужно применять уловки, типа содержания зависящего от времени, масса вебмастеров все ещё используют CGI-скрипты, которые производят редиректы на специальные страницы.

Как это может быть сделано через mod_rewrite? Есть много переменных названных TIME_xxx для условий редиректа. В связке со специальными лексикографическими образцами для сравнения <STRING, >STRING и =STRING мы можем производить редиректы зависящие от времени:

      RewriteEngine on
      RewriteCond   %{TIME_HOUR}%{TIME_MIN} >0700
      RewriteCond   %{TIME_HOUR}%{TIME_MIN} <1900
      RewriteRule   ^foo\.html$             foo.day.html
      RewriteRule   ^foo\.html$             foo.night.html

Это выдает содержимое foo.day.html при запросе URL foo.html с 07:00 до 19:00 а в оставшееся время содержимое foo.night.html.

Убираем у всех запросов вначале «WWW.»

  RewriteEngine on    # оглашаем, что хотим использовать mod_rewrite
  RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
  RewriteRule ^/?(.*) http://%1/$1 [L,R=permanent]

Меняем расширение .html на .php

Иногда бывает так, что у вас статичный веб-сайт, а вам необходимо, чтобы на нем срабатывал какой-нибудь php-скрипт. Для этого вам необходимо сказать серверу, чтобы он обрабатывал эту страницу как php-файл.

AddHandler application/x-httpd-php .html

Этот прием можно использовать и для других расширений файлов:

  AddHandler application/x-httpd-php .xml
  AddHandler application/x-httpd-php .asp



Запрещаем доступ для всех ко всем файлам в директории deny from all
к конкретному файлу:

  <Files secret.php>
  deny from all
  </Files>

по ip пользователя:

  order deny,allow
  deny from all
  allow from 192.152.37.125

Доступ в данную директорию будет разрешён только пользователю с ip 192.152.37.125.

И наоборот, если хотите запретить отдельным ip пользователей доступ к вашему сайту, то пропишете следующие строчки:

  <Limit GET POST PUT>
  order allow,deny
  allow from all
  deny from 192.152.37.125
  deny from 123.456.177
  </LIMIT>

Директива Options -Indexes — запрет на отображение содержимого каталога при отсутствии индексного файла.

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

Options -Indexes

В этом случае, вместо списка файлов в каталоге посетитель получит HTTP ошибку 403 - access forbidden.

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

  <Files ~ \"\.(inc|conf|cfg)$\">
    deny from all
  </Files>

Запрещен доступ к файлам с расширением .inc, .conf и *.cfg. Хотя директива, по умолчанию, не работает с регулярными выражениями, но их можно включить поставив символ тильды(~) в опциях директивы. Синтаксис следующий: [тильда] [пробел] [далее_все_без_пробелов] Чтобы блокировать этот доступ, запишем следующее:

RewriteRule ^.htaccess$ - [F]

Это значит, что если кто-то пробует обращаться к файлу .htaccess, система должна произвести код ошибки 'HTTP response of 403' или '403 Forbidden - You don't have permission to access /.htaccess on this server'.

Конструкция ^.htaccess$ в этом регулярном выражении означает:

^ - якорь начала строки
$ - якорь конца строки
. - в регулярных выражениях точка . обозначает мета-символ и должна быть защищена обратным слэшем (backslash), если вы все-таки хотите использовать именно фактическую точку.

Имя файла должно быть расположено точно между начальным и конечным якорем. Это будет гарантировать то, что только это определенное имя файла (и никакое другое) сгенерирует код ошибки.

[F] - специальный 'запрещающий' флажок (forbidden).
[NC] - не учитывать регистр букв.
[OR] - означает 'или следующее условие'.



Определение кодировки, в которой сервер «отдает» файлы

AddDefaultCharset windows-1251

Варианты: KOI8-R, UTF-8, Windows-1251

Определение кодировки на загружаемые файлы

CharsetSourceEnc windows-1251



Инструкция как закрыть папку паролем находится - НА ЭТОЙ СТРАНИЦЕ



Инструкция на создание своих страниц ошибок находится - НА ЭТОЙ СТРАНИЦЕ

IE игнорирует страницы размером меньше 512 байт.



Чтобы избежать индексации поисковыми системами директорий и поддиректорий, необходимо прописать, например, такую строку:

DirectoryIndex index.php

Эта директива задает файл, который будет вызван при обращении к директории без указания имени файла.

Можно указать несколько индексных страниц. При запросе каталога они будут искаться в том порядке, в котором перечислены в директиве DirectoryIndex. Если не будет найден файл index.html, то будет произведен поиск файла index.php и т.д.

DirectoryIndex index.html index.php index.shtml

Мы рекомендуем делать переадресацию с пустых директорий либо на главную страницу сайта, либо на другую подходящую страницу. Например, директорию www.site.ru/pic/ можно переадресовать на www.site.ru.



Часто веб-мастера нагло копируют контент с вашего сайта вместе с рисунками, причем рисунки подгружаются с вашего же сервера. Это создает лишний трафик, что, зачастую, приводит к ряду проблем.

Защититься от таких веб-мастеров и не помешать поисковым роботам индексировать изображения достаточно просто:

  RewriteEngine on
  RewriteCond %{HTTP_REFERER} .
  RewriteCond %{HTTP_REFERER} !^http://([^.]+\.)?site\. [NC]
  RewriteCond %{HTTP_REFERER} !google\. [NC]
  RewriteCond %{HTTP_REFERER} !search\?q=cache [NC]
  RewriteCond %{HTTP_REFERER} !msn\. [NC]
  RewriteCond %{HTTP_REFERER} !yahoo\. [NC]
  RewriteCond %{REQUEST_URI} !^/hotlinker\.gif$
  RewriteRule \.(gif|jpg|png)$ /hotlinker.gif [NC,L]

hotlinker.gif - изображение, которое будет отображаться, вместо истинных изображений. Рекомендуем в этом изображении отобразить ваш логотип и ссылку на ваш сайт.

Еще один варинат запрета доступа к картинкам с неразрешенных сайтов:

  SetEnvIfNoCase Referer "^$" local_ref=1
  SetEnvIfNoCase Referer "^http://(www\.)?domain\.ru" local_ref=1
  SetEnvIfNoCase Referer "^http://(www\.)?images\.yandex\.ru" local_ref=1
  SetEnvIfNoCase Referer "^http://(www\.)?hghltd\.yandex\.com" local_ref=1
  <FilesMatch ".(jpg|gif|png)">
  Order Allow,Deny
  Allow from env=local_ref
  </FilesMatch>

Поисковые машини и разного рода сканеры создают коллосальный трафик на вашем сайте. Нижеприведенный блок кода позволит запретить доступ ботам на сайт.

  RewriteCond %{HTTP_USER_AGENT} (Googlebot|Slurp|spider|Twiceler|heritrix|
Combine|appie|boitho|e-SocietyRobot|Exabot|Nutch|OmniExplorer|
MJ12bot|ZyBorg/1|Ask\ Jeeves|AskJeeves|ActiveTouristBot|
JemmaTheTourist| agadine3|BecomeBot|Clustered-Search-Bot|
MSIECrawler|freefind|galaxy|genieknows|INGRID|grub-client|
MojeekBot|NaverBot|NetNose-Crawler|OnetSzukaj|PrassoSunner|
Asterias\ Crawler|T-H-U-N-D-E-R-S-T-O-N-E|GeorgeTheTouristBot|
VoilaBot|Vagabondo|fantomBro wser|stealthBrowser|cloakBrowser|
fantomCrew\ Browser|Girafabot|Indy\ Library|Intelliseek|Zealbot|
Windows\ 95|^Mozilla/4\.05\ \[en\]$|^Mozilla/4\.0$) [NC]
  RewriteRule ^(.*)$ - [F]
  #
  RewriteCond %{HTTP_USER_AGENT} ^Mozilla.* [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^Opera.* [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^Firefox.* [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^Netscape.* [NC]
  RewriteRule ^(.*)$ - [L]
  RewriteRule ^(.*)$ - [F]



Чтобы иметь больше информации о посещении поисковиков, полезно иметь подробную информацию об обращении к файлу robots.txt. Для того, чтобы оганизовать это, в '.htaccess' должны быть следующие записи:

  RewriteEngine on
  Options +FollowSymlinks
  RewriteBase /
  RewriteRule ^robots.txt$ /robot.php?%{REQUEST_URI}

Теперь при запросе файла robots.txt наш RewriteRule переадресует посетителя (робота) к обрабатывающему запросы скрипту robot.php.
Кроме того, переменная передается скрипту, которая будет обработана в соответствии с вашими нуждами. REQUEST_URI определяет имя запрашиваемого файла. В данном примере это robots.txt. Скрипт прочтет содержание robots.txt и отправит его web-браузеру или роботу поискового сервера. Таким образом, мы можем считать хиты посетителей и вести лог-файлы.



Для отключения добавления PHPSESSID к URL вставьте в начало index.php:

ini_set("session.use_trans_sid", 0);, либо в .htaccess пропишите:
php_flag session.use_trans_sid Off

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



Кэширование для всех типов файлов по времени доступа

  ExpiresActive on
  ExpiresDefault "access plus 600 seconds"

Кэширование для всех типов файлов по времени изменения

  ExpiresActive on
  ExpiresDefault "modification plus 600 seconds"

Кэширование для определённых типов файлов

  ExpiresByType text/css "modification plus 600 seconds"
  ExpiresByType image/jpeg "modification plus 600 seconds"
  ExpiresByType image/gif "modification plus 600 seconds"
  ExpiresByType image/x-ico "modification plus 600 seconds"
  ExpiresByType image/png "modification plus 600 seconds"

Запрет кеширования с помощью сервера Apache

Впишите в .htaccess следующее:

  # Запрещение кеширования в этой папке
  # Необходимо включение модулей
  # mod_headers.c и mod_expires.c
  #
  # Заголовок Cache-Control
  <IfModule mod_headers.c>
  Header append Cache-Control \"no-store, no-cache, must-revalidate\"
  </IfModule>

  # Заголовок Expires
  <IfModule mod_expires.c>
  ExpiresActive On
  ExpiresDefault \"now\"
  </IfModule>

Необходимые заголовки будут передаваться автоматически и специально писать их в PHP уже не нужно — кэш уже выключен!

Кеширование с помощью файла .htaccess

  # Разрешение кеширования в этой папке
  # Необходимо включение модулей
  # mod_headers.c и mod_expires.c
  #
  <IfModule mod_expires.c>
  ExpiresActive on
  #ExpiresDefault \"access plus 1 hours\"
  #ExpiresDefault \"access plus 10 years\"
  ExpiresDefault                          \"access plus 1 month\"
  ExpiresByType text/cache-manifest       \"access plus 0 seconds\"
  ExpiresByType text/html                 \"access plus 0 seconds\"
  ExpiresByType text/xml                  \"access plus 0 seconds\"
  ExpiresByType application/xml           \"access plus 0 seconds\"
  ExpiresByType application/json          \"access plus 0 seconds\"
  ExpiresByType application/rss+xml       \"access plus 1 month\"
  ExpiresByType image/x-icon              \"access plus 1 week\"
  ExpiresByType image/gif                 \"access plus 1 year\"
  ExpiresByType image/png                 \"access plus 1 year\"
  ExpiresByType image/jpg                 \"access plus 1 year\"
  ExpiresByType image/jpeg                \"access plus 1 year\"
  ExpiresByType video/ogg                 \"access plus 1 year\"
  ExpiresByType audio/ogg                 \"access plus 1 year\"
  ExpiresByType audio/mp3                 \"access plus 1 year\"
  ExpiresByType video/mp4                 \"access plus 1 year\"
  ExpiresByType video/webm                \"access plus 1 year\"
  ExpiresByType text/x-component          \"access plus 1 month\"
  ExpiresByType font/truetype             \"access plus 1 year\"
  ExpiresByType font/opentype             \"access plus 1 year\"
  ExpiresByType application/x-font-woff   \"access plus 1 year\"
  ExpiresByType image/svg+xml             \"access plus 1 month\"
  ExpiresByType application/vnd.ms-fontobject \"access plus 1 year\"
  ExpiresByType text/css                  \"access plus 2 months\"
  ExpiresByType application/javascript    \"access plus 2 months\"
  ExpiresByType text/javascript           \"access plus 2 months\"
  <IfModule mod_headers.c>
  Header append Cache-Control \"public\"
  </IfModule>
  </IfModule>

Кеширование javascript файлов с помощью файла .htaccess

  <FilesMatch .*\.js$>
  ExpiresDefault \"access plus 3 days\"
  </FilesMatch>

Будьте осторожны при кешировании, т.к. при изменении файла пользователь может получить новый вариант только через 3 дня!



Пропишите в своем файле .htaccess следующие строки:

  RemoveHandler .php .htm .html
  AddHandler application/x-httpd-php .php .htm .html

Поиск страниц больше чем в одном каталоге

Иногда необходимо позволить веб-серверу искать страницы больше, чем в одном каталоге.

RewriteEngine on

  #   во-первых попытаемся найти это в указанном месте/...
  #   ...и если нашли то заканчиваем поиск:
  RewriteCond         /your/docroot/dir1/%{REQUEST_FILENAME}  -f
  RewriteRule  ^(.+)  /your/docroot/dir1/$1  [L]

  #   во-вторых - попытаемся найти это в pub/...
  #   ...и если нашли то заканчиваем поиск:
  RewriteCond         /your/docroot/dir2/%{REQUEST_FILENAME}  -f
  RewriteRule  ^(.+)  /your/docroot/dir2/$1  [L]

  #   иначе продолжаем для других директив
  RewriteRule   ^(.+)  -  [PT]



Если Вы хотите предоставлять адреса www.subdomain.domain.ru для страниц пользователей, вы можете использовать следующий набор правил для преобразования http://www.subdomain.domain.ru/path во внутренний путь /home/login/path:


  RewriteEngine on
  RewriteCond   %{HTTP_HOST}                 ^www\.[^.]+\.ru$
  RewriteRule   ^(.+)                        %{HTTP_HOST}$1          [C]
  RewriteRule   ^www\.([^.]+)\.ru(.*) /home/$1$2



Если при передаче файлов через формы (при указанном enctype=«multipart/form-data») бинарные данные повреждаются, пропишите в /cgi-bin/.htaccess директиву:

  CharsetRecodeMultipartForms Off.



Ошибки при обращении к страницам, содержащим ключевые слова, типа $_REQUEST.

Такое может происходить из-за установленного модуля в Apache. По умолчанию он блокирует в запросах строки с SQL аргументами и другими потенциально опасными командами.

Возможные сообщения об ошибке:

Forbidden You don't have permission to access /adm/index.php on this server. Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.

или

Запрос небезопасен и был отвергнут.

Добавьте в .htaccess следующее:

  <IfModule mod_security.c>
  SecFilterEngine Off
  SecFilterScanPOST Off
  </IfModule>

Для сообщения: "POST /wp-admin/async-upload.php HTTP/1.1" 406 354 "-" "Shockwave Flash" можно снять защиту только на загрузку файлов на сервер:

  <IfModule mod_security.c>
  <Files async-upload.php>
  SecFilterEngine Off
  SecFilterScanPOST Off
  </Files>
  </IfModule>

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



Обычно код главной страницы физически расположен в файле index.html или index.php, но сайт должен открываться по любому из запросов: yoursite.ru, yoursite.ru/index.html, www.yoursite.ru и www.yoursite.ru/index.html. Но для поисковых систем это четыре разные URL! Если не настроить .htaccess верно, поисковик добавит в свой индекс четыре одинаковые страницы. Это признак некачественного сайта. Избежать этой проблемы можно с помощью такого кода в .htaccess:

  Options +FollowSymLinks
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^yoursite.ru
  RewriteRule (.*) http://www.yoursite.ru/$1 [R=301,L]
  RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html\ HTTP/
  RewriteRule ^index\.html$ http://www.yoursite.ru/ [R=301,L]

Все страницы-дубли будут склеены редиректом с кодом 301 с главной страницей – http://www.yoursite.ru/. Дубли страниц без слэша в конце URL.

Чтобы предотвратить ситуацию с индексированием страниц www.yoursite.ru/about и www.yoursite.ru/about/ как разных, ставим следующий код:

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

Со страниц без слэша будет установлен редирект на «слэшевые».

Принудительная постановка замыкающего слеша

Следующий код всегда будет добавлять слеш в адрес URL вашего сайта, что хорошо помогает в области SEO сайта:

  RewriteCond %{REQUEST_URI} /+[^\.]+$
  RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]



Многие видели, как при попытке скачать архив с расширением .rar браузер открывает его в виде простого текста из мешанины символов. Это значит, что на сервере сайта не настроено принудительное сохранение типов файлов, которые не должны открываться в браузере:

AddType application/octet-stream .rar .doc .mov .avi .pdf .xls .mp4



  SetOutputFilter DEFLATE
  Header unset ETag
  FileETag None



При использовании встроенных шрифтов Firefox не позволяет брать их с внешних сайтов. Следующий код для файла .htaccess позволит обойти данное ограничение:

  <FilesMatch \"\.(ttf|otf|eot|woff)$\">
  <IfModule mod_headers.c>
  #Замените yourdomain.com на адрес вашего блога
  Header set Access-Control-Allow-Origin \"http://yourdomain.com\"
  </IfModule>
  </FilesMatch>



При разработке кода JavaScript иногда требуется использовать PHP в файлах .js, например, для получения данных из базы данных:

  AddType application/x-httpd-php .js
  AddHandler x-httpd-php5 .js

  <FilesMatch "\.(js|php)$">
  SetHandler application/x-httpd-php
  </FilesMatch>

Разложить файлы robots.txt, sitemap.xml и т.п. в папки доменов

Если есть запрашиваемый файл из корня сайта, в папке домена, то перенаправляем его туда:

  RewriteCond         %{DOCUMENT_ROOT}/domain/%{HTTP_HOST}/root%{REQUEST_URI} -f
  RewriteRule ^(.*)$  /domain/%{HTTP_HOST}/root/$1  [L]



Если вы столкнулись с проблемой, что какие-то типы User Agent нагружают ваш сервер ненужными запросами, то от них можно избавиться добавив в .htaccess следующие строчки:

  SetEnvIfNoCase User-Agent "^Black Hole" bad_bot
  SetEnvIfNoCase User-Agent "^Titan" bad_bot
  SetEnvIfNoCase User-Agent "^WebStripper" bad_bot
  SetEnvIfNoCase User-Agent "^NetMechanic" bad_bot
  SetEnvIfNoCase User-Agent "^CherryPicker" bad_bot
  SetEnvIfNoCase User-Agent "^EmailCollector" bad_bot
  SetEnvIfNoCase User-Agent "^EmailSiphon" bad_bot
  SetEnvIfNoCase User-Agent "^WebBandit" bad_bot
  SetEnvIfNoCase User-Agent "^EmailWolf" bad_bot
  SetEnvIfNoCase User-Agent "^ExtractorPro" bad_bot
  SetEnvIfNoCase User-Agent "^CopyRightCheck" bad_bot
  SetEnvIfNoCase User-Agent "^Crescent" bad_bot
  SetEnvIfNoCase User-Agent "^Wget" bad_bot
  SetEnvIfNoCase User-Agent "^SiteSnagger" bad_bot
  SetEnvIfNoCase User-Agent "^ProWebWalker" bad_bot
  SetEnvIfNoCase User-Agent "^CheeseBot" bad_bot
  SetEnvIfNoCase User-Agent "^Teleport" bad_bot
  SetEnvIfNoCase User-Agent "^TeleportPro" bad_bot
  SetEnvIfNoCase User-Agent "^MIIxpc" bad_bot
  SetEnvIfNoCase User-Agent "^Telesoft" bad_bot
  SetEnvIfNoCase User-Agent "^Website Quester" bad_bot
  SetEnvIfNoCase User-Agent "^WebZip" bad_bot
  SetEnvIfNoCase User-Agent "^moget/2.1" bad_bot
  SetEnvIfNoCase User-Agent "^WebZip/4.0" bad_bot
  SetEnvIfNoCase User-Agent "^WebSauger" bad_bot
  SetEnvIfNoCase User-Agent "^WebCopier" bad_bot
  SetEnvIfNoCase User-Agent "^NetAnts" bad_bot
  SetEnvIfNoCase User-Agent "^Mister PiX" bad_bot
  SetEnvIfNoCase User-Agent "^WebAuto" bad_bot
  SetEnvIfNoCase User-Agent "^TheNomad" bad_bot
  SetEnvIfNoCase User-Agent "^WWW-Collector-E" bad_bot
  SetEnvIfNoCase User-Agent "^RMA" bad_bot
  SetEnvIfNoCase User-Agent "^libWeb/clsHTTP" bad_bot
  SetEnvIfNoCase User-Agent "^asterias" bad_bot
  SetEnvIfNoCase User-Agent "^httplib" bad_bot
  SetEnvIfNoCase User-Agent "^turingos" bad_bot
  SetEnvIfNoCase User-Agent "^spanner" bad_bot
  SetEnvIfNoCase User-Agent "^InfoNaviRobot" bad_bot
  SetEnvIfNoCase User-Agent "^Harvest/1.5" bad_bot
  SetEnvIfNoCase User-Agent "^Bullseye/1.0" bad_bot
  SetEnvIfNoCase User-Agent "^Mozilla/4.0 (compatible; BullsEye; Windows 95)" bad_bot
  SetEnvIfNoCase User-Agent "^Crescent Internet ToolPak HTTP OLE Control v.1.0" bad_bot
  SetEnvIfNoCase User-Agent "^CherryPickerSE/1.0" bad_bot
  SetEnvIfNoCase User-Agent "^CherryPicker /1.0" bad_bot
  SetEnvIfNoCase User-Agent "^WebBandit/3.50" bad_bot
  SetEnvIfNoCase User-Agent "^NICErsPRO" bad_bot
  SetEnvIfNoCase User-Agent "^Microsoft URL Control - 5.01.4511" bad_bot
  SetEnvIfNoCase User-Agent "^DittoSpyder" bad_bot
  SetEnvIfNoCase User-Agent "^Foobot" bad_bot
  SetEnvIfNoCase User-Agent "^WebmasterWorldForumBot" bad_bot
  SetEnvIfNoCase User-Agent "^SpankBot" bad_bot
  SetEnvIfNoCase User-Agent "^BotALot" bad_bot
  SetEnvIfNoCase User-Agent "^lwp-trivial/1.34" bad_bot
  SetEnvIfNoCase User-Agent "^lwp-trivial" bad_bot
  SetEnvIfNoCase User-Agent "^Wget/1.6" bad_bot
  SetEnvIfNoCase User-Agent "^BunnySlippers" bad_bot
  SetEnvIfNoCase User-Agent "^Microsoft URL Control - 6.00.8169" bad_bot
  SetEnvIfNoCase User-Agent "^URLy Warning" bad_bot
  SetEnvIfNoCase User-Agent "^Wget/1.5.3" bad_bot
  SetEnvIfNoCase User-Agent "^LinkWalker" bad_bot
  SetEnvIfNoCase User-Agent "^cosmos" bad_bot
  SetEnvIfNoCase User-Agent "^moget" bad_bot
  SetEnvIfNoCase User-Agent "^hloader" bad_bot
  SetEnvIfNoCase User-Agent "^humanlinks" bad_bot
  SetEnvIfNoCase User-Agent "^LinkextractorPro" bad_bot
  SetEnvIfNoCase User-Agent "^Offline Explorer" bad_bot
  SetEnvIfNoCase User-Agent "^Mata Hari" bad_bot
  SetEnvIfNoCase User-Agent "^LexiBot" bad_bot
  SetEnvIfNoCase User-Agent "^Web Image Collector" bad_bot
  SetEnvIfNoCase User-Agent "^The Intraformant" bad_bot
  SetEnvIfNoCase User-Agent "^True_Robot/1.0" bad_bot
  SetEnvIfNoCase User-Agent "^True_Robot" bad_bot
  SetEnvIfNoCase User-Agent "^BlowFish/1.0" bad_bot
  SetEnvIfNoCase User-Agent "^JennyBot" bad_bot
  SetEnvIfNoCase User-Agent "^MIIxpc/4.2" bad_bot
  SetEnvIfNoCase User-Agent "^BuiltBotTough" bad_bot
  SetEnvIfNoCase User-Agent "^ProPowerBot/2.14" bad_bot
  SetEnvIfNoCase User-Agent "^BackDoorBot/1.0" bad_bot
  SetEnvIfNoCase User-Agent "^toCrawl/UrlDispatcher" bad_bot
  SetEnvIfNoCase User-Agent "^WebEnhancer" bad_bot
  SetEnvIfNoCase User-Agent "^TightTwatBot" bad_bot
  SetEnvIfNoCase User-Agent "^suzuran" bad_bot
  SetEnvIfNoCase User-Agent "^VCI WebViewer VCI WebViewer Win32" bad_bot
  SetEnvIfNoCase User-Agent "^VCI" bad_bot
  SetEnvIfNoCase User-Agent "^Szukacz/1.4" bad_bot
  SetEnvIfNoCase User-Agent "^QueryN Metasearch" bad_bot
  SetEnvIfNoCase User-Agent "^Openfind data gathere" bad_bot
  SetEnvIfNoCase User-Agent "^Openfind" bad_bot
  SetEnvIfNoCase User-Agent "^Xenu's Link Sleuth 1.1c" bad_bot
  SetEnvIfNoCase User-Agent "^Xenu's" bad_bot
  SetEnvIfNoCase User-Agent "^Zeus" bad_bot
  SetEnvIfNoCase User-Agent "^RepoMonkey Bait & Tackle/v1.01" bad_bot
  SetEnvIfNoCase User-Agent "^RepoMonkey" bad_bot
  SetEnvIfNoCase User-Agent "^Zeus 32297 Webster Pro V2.9 Win32" bad_bot
  SetEnvIfNoCase User-Agent "^Webster Pro" bad_bot
  SetEnvIfNoCase User-Agent "^EroCrawler" bad_bot
  SetEnvIfNoCase User-Agent "^LinkScan/8.1a Unix" bad_bot
  SetEnvIfNoCase User-Agent "^Keyword Density/0.9" bad_bot
  SetEnvIfNoCase User-Agent "^Kenjin Spider" bad_bot
  SetEnvIfNoCase User-Agent "^Cegbfeieh" bad_bot

  <limit get="" post="" head="">
  Order Allow,Deny
  Allow from all
  Deny from env=bad_bot
  </limit>



  RewriteEngine on
  RewriteCond %{HTTP:Accept-Language} (ru) [NC]
  RewriteRule .* КУДА [L]



 RewriteEngine on   
 RewriteCond %{ENV:HTTPS} !on
 RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L]

Защита картинок от скачивания по ссылкам на других сайтах

Включая переходы без REFERER, т.е. когда адрес указывают в строке браузера:

  RewriteEngine on
  RewriteCond %{HTTP_REFERER} !^$
  RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain.com [NC]
  RewriteRule \.(jpg|jpeg|png|gif)$ КУДА_ПОСЛАТЬ [NC,R,L]

Только по ссылкам на чужих сайтах:

  RewriteEngine on
  RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain.com [NC]
  RewriteRule \.(jpg|jpeg|png|gif)$ КУДА_ПОСЛАТЬ [NC,R,L]

Блокировка пользователей с определенным рефером

Если вы не хотите, чтобы пользователи переходя с определенных сайтов попадали на ваш, вы можете это запретить:

  RewriteEngine on
  RewriteCond %{HTTP_REFERER} bannedurl1.com [NC,OR]
  RewriteCond %{HTTP_REFERER} bannedurl2.com [NC,OR]
  RewriteRule .* - [F]