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

### Закомментированое указание индексного файла – название  (по умолчанию) файла может быть любым – указывается и раскомментируется при необходимости
#DirectoryIndex index.php index.html
### Закрываем доступ по ip нарушителям (пустым быть не может – лучше совсем удалить, если некого банить
Order Allow,Deny
Allow from all
Deny from 127.0.2.1
###Бан ботов по подсети IP
# Bots: Twingly Recon, twingly.com
Deny from 80.252.169.0 – 80.252.171.255
# Bots: Parse Robot
Deny from 146.120.240.0 – 146.120.255.255
# Bots: Synapse bot
Deny from 94.242.206.90 – 94.242.222.107
# Bots: PaperLiBot/2.1, support.paper.li
Deny from 37.187.149.179 – 37.187.186.143
###Кодировка
AddDefaultCharset utf-8
###запрещает показывать содержимое каталогов, если в них нет индексного файла
Options -Indexes
###позволяет использовать символические ссылки на файлы или каталоги вне корня сайта
Options +FollowSymLinks
###Временная зона сайта: http://www.php.net//manual/ru/timezones.php

SetEnv TZ Europe/Moscow

###скрыть подпись сервера
ServerSignature Off
###включение режима перенаправления – в идеале лучше проверять наличие модуля, но его отсутствие/невключение достаточно редко (все правила включить между и
RewriteEngine On
###указываем корень перенаправления – если, например, сайт в подпапке, то указывается эта папка как отправная точка отсчета
RewriteBase /
###Склейка зеркал на основной без www
RewriteCond %{HTTP_HOST} ^www.site\.com$ [NC] RewriteRule ^(.*)$ http://site.com/$1 [R=301,L] ###Убирается расширение .php из адресной строки
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L] ###закомментировано: закрываем доступ по имени сайта (если даже ip изменится, то название все равно останется)
#RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?bad_site.com.*$ [NC] #RewriteRule .* – [F,L] ###Попытка закрыть возможность скачивания через телепорт – бесполена, в общем-то, поскольку он и подобные могут маскироваться под USER_AGENT разных браузеров – но все-таки
RewriteCond %{HTTP_USER_AGENT} ^Teleport
RewriteRule ^.*$ – [F] ###Блокировка доступа к сканированию сайта роботами Ahrefs и Open Site Explorer
RewriteCond %{HTTP_USER_AGENT} ^rogerbot [OR] RewriteCond %{HTTP_USER_AGENT} ^AhrefsBot
RewriteRule .* – [F] ###Защита от хотлинка – то есть, от отображения материалов сайта на другом сайта через простое указание источника. Можно добавлять любые желаемые расширения по тому же принципу
RewriteCond %{HTTP_REFERER} !^$
#если пришли и _не_ с сайта http://site.ru
RewriteCond %{HTTP_REFERER} !^http://(www.)?site\.com/.*$ [NC] RewriteRule .(jpg|gif|png|css|mov|swf|dcr|exe|rar|avi|vob|zip)$ – [F] ###Явное выключение магических кавычек: _http://www.php.su/security/?magicquotes
php_flag magic_quotes_gpc off
###Закомментированное явное отключение глобальных переменных – опции в php.ini, которая указывает на необходимость регистрации переменных полученные методом POST или GET в глобальный массив $GLOBALS
#php_value register_globals 0
###отключаем вывод ошибок – в лог писаться будут, а пользователю незачем видеть
php_flag display_errors off
php_flag display_startup_errors off
###сжатие по типам – если модкль включен

mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$
mod_gzip_item_include mime ^text\.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image\.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*

###кэширование, кастомизированное по типам

#кэшировать html и htm файлы на один день
<FilesMatch “\.(html|htm)$”>
Header set Cache-Control “max-age=43200”

#кэшировать css, javascript и текстовые файлы на одну неделю
<FilesMatch “\.(js|css|txt)$”>
Header set Cache-Control “max-age=604800”

#кэшировать флэш и изображения на месяц
<FilesMatch “\.(flv|swf|ico|gif|jpg|jpeg|png)$”>
Header set Cache-Control “max-age=2592000”

#отключить кэширование
<FilesMatch “\.(pl|php|cgi|spl|scgi|fcgi)$”>
Header unset Cache-Control

###Продолжение кэширования по другому модулю

ExpiresActive On
#по умолчанию кеш в 5 секунд
ExpiresDefault “access plus 5 seconds”
#кэшировать флэш и изображения на месяц
ExpiresByType image/x-icon “access plus 2592000 seconds”
ExpiresByType image/jpeg “access plus 2592000 seconds”
ExpiresByType image/png “access plus 2592000 seconds”
ExpiresByType image/gif “access plus 2592000 seconds”
ExpiresByType application/x-shockwave-flash “access plus 2592000 seconds”
#кэшировать css, javascript и текстовые файлы на одну неделю
ExpiresByType text/css “access plus 604800 seconds”
ExpiresByType text/javascript “access plus 604800 seconds”
ExpiresByType application/javascript “access plus 604800 seconds”
ExpiresByType application/x-javascript “access plus 604800 seconds”
#кэшировать html и htm файлы на один день
ExpiresByType text/html “access plus 43200 seconds”
#кэшировать xml файлы на десять минут
ExpiresByType application/xhtml+xml “access plus 600 seconds”

Блокировка доступа по IP-адресам в .htaccess

Блокировка доступа по IP-адресам в .htaccess

Памятка по ограничению доступа к сайту. Для ограничения прав доступа в .htaccess существуют директивы Deny и Allow.

Первым шагом следует задать порядок их обработки, например:

Order Allow, Deny

Порядок следования –  Allow, Deny или Deny, Allow – имеет значение:

  • При Allow, Deny сначала обрабатываются разрешающие правила Allow, затем запрещающие Deny. Действия, не подпадающие ни под одну из директив Allow или Deny, будут запрещены по умолчанию.
  • При Deny, Allow сначала обрабатываются запрещающие правила Deny, затем разрешающие Allow. Действия, не подпадающие ни под одну из директив Deny или Allow, будут разрешены по умолчанию.

Следующим шагом указываются блокируемые ip, например:

deny from 103.4.0.0

Можно не указывать последние октеты, и тогда будет заблокирован весь пропущенный диапазон адресов:

deny from 103.4.0

Например, нужно граничить диапазон  103.4.0.0 – 103.11.255.255. Перечислять 11 диапазонов простое решение, но утомительное. А если завтра их станет 200? Решение есть и в этом случае – нужно указать диапазон в синтаксисе т.н. безклассовой адресации (CIDR).  Для удобства используем  онлайн-калькулятор ip-диапазона в CIDR. Вводим туда наш диапазон и получаем готовое правило:

deny from 103.4.0.0/14
deny from 103.8.0.0/14

Еще ссылка на полезные странички:
список ip-диапазонов по географическому признаку.
php скрипт для определения географического положения посетителей , скрипт php определить город по ip