Источник: https://n0where.net/common-htaccess-snippets/
Файл .htaccess (hypertext access) это конфигурационный файл на уровне директорий, он поддерживается несколькими веб-серверами. Благодаря ему возможно децентрализованное управление настройками веб-сервера. Эти файлы раскиданы по каталогам сервера и они способны изменять глобальные настройки сервера для конкретной директории, в которой они размещены и для поддиректорий.
Первоначальное использование .htacces отражено в его названии (гипертекстовый доступ) — контроль разрешения доступа посредством, например, требованием пароля для доступа к контенту. Тем не менее, намного чаще файлы .htaccess используются для переопределения многих других конфигурационных настроек, таких как тип контента, кодировка, CGI обработчики и т.д.
Программное обеспечение сервера Apache обеспечивает распределённое (т. е. на уровне директорий) конфигурирование посредством файлов Hypertext Access. Эти файлы .htaccess включают локализованную тонкую настройку универсальных директив системной конфигурации Apache, которые определены в главном конфигурационном файле Apache. Местные директивы .htaccess должны работать из файла под названием .htaccess. У пользователя должны быть надлежащие разрешения для доступа и/или редактирования файла .htaccess. Кроме того, права доступа файла .htaccess никогда не должны иметь разрешение на запись кем угодно — т. е. это настройка параметров разрешений “644”, которая позволяет всеобщий доступ для чтения, а разрешение на запись даёт только пользователю. Наконец, правила .htaccess применяются к родительской директории (в которой лежит файл) и всем поддиректориям. Т.е. чтобы применить правила настройки ко всему веб-сайту, разместите файл .htaccess в корневой директории сайта.
Обычное использование .htaccess
- Авторизация, аутентификация — Файл .htaccess часто используется для установки ограничений безопасности для каталога, помните про “access” в имени файла? .htaccess часто сопровождается файлом .htpasswd, в котором собраны валидные имена пользователей и их пароли.
- Переписывание URL — Серверы часто используют .htaccess для перезаписи длинных, чрезмерно сложны URL в более короткие и лёгкие для запоминания.
- Блокировки — Используются allow/deny для блокировки IP адреса или домена. Также полезен для блокировки плохих ботов, рипперов и рефереров. Часто используется для ограничения доступа паукам поисковых машин.
- SSI — включают инклуды на стороне сервера.
- Листинг каталогов — Контролирует, как сервер будет реагировать, когда специфичная веб-страница (обычно это index.htm, index.html, index.php или любая другая — в зависимости от настройки) отсутствует.
- Настройка страниц ошибок — Изменение страницы, которая показывается при возникновении ошибки на стороне сервера, например, ошибки HTTP 404 Страница не найдена или дают знать поисковым машинам, что страница была перемещена — HTTP 301 Moved Permanently.
- MIME types (типы) — Инструктирует сервер, как работать с различными типами файлов.
- Cache Control (контроль кэша) — .htaccess файлы позволяют серверу контролировать кэширование веб-браузерами и проксями для уменьшения нагрузки на сеть, на сервер и предотвращения проявления лагов.
Комментирование кода в .htaccess
Комментирование — это основа для поддержания контроля за определённым участком кода. Комментарии в коде файла .htaccess ставятся построчно, каждая строка комментариев начинается со знака решётки #. Таким образом, если нам нужно закомментировать несколько строк файла .htaccess, то нам нужно поставить несколько решёток в начале каждого файла. Кроме того, из-за не всегда предсказуемого поведения файла htaccess, разумно включать только алфавитные символы (и, возможно, несколько тире и подчёркиваний) в комментарии файла .htaccess.
Преимущества .htaccess
- Немедленные изменения — Поскольку файлы .htaccess читаются при каждом запросе, изменения, сделанные в этих файлах, имеют немедленный эффект — в отличие от главного конфигурационного файла, для которого требуется перезапуск сервера, чтобы новые строки возымели эффект.
- Непривилегированные пользователи — Для серверов с множеством пользователей, часто желательно позволять индивидуальным пользователям использовать их собственную конфигурацию сайта. Использование файлов .htaccess позволяет такую индивидуализацию и для непривилегированных пользователей — поскольку не нужно изменять главные конфигурационные файлы сервера.
Недостатки .htaccess
Контролировать Apache только главными файлами конфигурации сервера часто предпочтительно по причинам безопасности и производительности:
- Потеря производительности — Для каждого HTTP запроса, когда используется .htaccess, требуется дополнительный доступ к файловой системе в родительскую директорию — для проверки возможных существующих файлов .htaccess в этих родительских директориях, которым разрешено работать с файлами .htaccess.
- Безопасность — Позволение индивидуальным пользователям модифицировать конфигурационные файлы сервера может стать причиной прорех в безопасности, если настройка не проведена должным образом.
Важная информация для нубов в .htaccess
Поскольку конфигурационынй файл .htaccess очень мощный, даже незначительная ошибка в синтаксисе (вроде пропущенного пробела) может привести к серьёзным неисправностям сервера. Поэтому очень важно сделать резервные копии всего, что связано с вашим сайтом (включая оригинальные файлы .htaccess) до того, как вы начнёте работать с вашим файлом (или файлами) .htaccess. Также важно проверить ваш веб-сайт на работоспособность после внесения любых изменений в ваш файл .htaccess. Если возникнут какие-либо проблемы, то сразу используйте ваши резервные копии для восстановления первоначальной функциональности.
Определения символов регулярных выражений для .htaccess
#
Решётка # инструктирует сервер игнорировать эту строку. Используется для добавления комментариев. Каждая строка комментариев требует свою собственную #. При добавлении комментариев хорошей практикой является использование только букв, номеров, тире и подчёркиваний. Подобная практика поможет ликвидировать/избежать потенциальные ошибки сервера при разборе файлов настроек.
[F]
– Запрещено: инструктирует сервер вернуть код ошибки 403 Forbidden клиенту
[L]
– Последнее правило: поручает серверу остановить перезапись после того, как эта директива будет отработана.
[N]
– Далее: поручает Apache применять правила перезаписи до тех пор, пока не будут пройдены все директивы перезаписи.
[G]
– Больше нет: инструктирует сервер для отправки сообщения статуса Gone (больше не существует).
[P]
– Прокси: инструктирует сервер обработать запрос модом mod_proxy
[C]
– Цепочка: поручает серверу связать текущее правило с предыдущим.
[R]
– Перенаправление: инструктирует Apache сделать редирект, в результате чего браузер запрашивает перезаписанный/модифицированный URL.
[NC]
– Без регистра: устанавливает любые связанные аргументы как регистронезависимые.
[PT]
– Пройти через: инструктирует mod_rewrite вернуть Апачу полученный URL для дальнейшего изменения в соответствии с заданными правилами.
[OR]
– Или: означает логическое “или”, которое связывает два выражения и если хотя бы одно из них будет истинной, то будет выполняться заданное правило.
[NE]
– Не экранировать: инструктирует сервер парсить вывод без экранирования символов.
[NS]
– Без подзапросов: инструктирует сервер пропускать директивы если они находятся внутри подзапроса.
[QSA]
– Добавить строку запроса: говорит серверу добавить строку запроса в конец выражения (URL).
[S=x]
– Пропустить: инструктирует сервер пропустить последующее “x” число правил если выявлено совпадение.
[E=variable:value]
– Переменные окружения: предписывает серверу установить значение переменной окружения “variable” на “value”.
[T=MIME-type]
– Тип Mime: объявляет тип mime целевого ресурса.
[]
– задаёт набор символов, в котором любой символ внутри квадратных скобок будет вызывать соответствие, например, [xyz] будет соответствовать x, y или z.
[]+
– набор символов, в котором любые комбинации внутри квадратных скобок будут вызывать соответствие, например, [xyz]+ будет соответствовать любому числу иксов, игреков и зедов или любым другим комбинациям этих символов.
[^]
– означает НЕ в наборе символов, например, [^xyz] будет соответствовать любому символу, кроме x, y и z.
[a-z]
– тире (-) между двумя символами в наборе символов ([]) означает диапазон символов между ними. например, [a-zA-Z] соответствует всем маленьким и большим буквам от a до z.
a{n}
– определяет точное количество n, предшествующего символа, например, x{3} соответствует ровно трём иксам.
a{n,}
– указывает на n или больше количество повторяющиеся символов. Например, x{3,} соответствует трём или более иксам.
a{n,m}
– устанавливает диапазон чисел между n и m предшествующего символа. Например, x{3,7} соответствует трём, четырём, пяти, шести или семи иксам.
()
– используется для группировки символов, в результате эти символы рассматриваются как единый блок. Например, (perishable)?press будет соответствовать press, с или без префикса perishable.
^
– означает начало тестируемой строки regex (regex = регулярное выражение), например, начало аргумента и последующие символы.
$
– означает конец тестируемой строки regex (regex = регулярное выражение), например, конечный символ и предшествующие ему символы.
?
– указывает на опциональность предшествующего символа. Например, monzas? Будет соответствовать monza или monzas, в то время как mon(za)? Будет соответствовать mon или monza. Например, x? соответствует нулю или одному x.
!
– объявляет отрицание. Например, “!string” соответствует чему угодно кроме “string”.
.
– точка служит указателем на один любой произвольный символ.
–
– говорит не перезаписывай URL, используется примерно так: “…domain.com.* – [F]”. Реальный пример RewriteRule «.exe» «-» [F] запрещать загрузку файлов с расширением exe. Ведь зачем нам проводить какие-то манипуляции с адресом, если запрос всё равно будет отклонён?
+
– соответствует одному или более предшествующему символу. Например, G+ соответствует одной или более G, в то время “+” будет соответствовать одному или более символу любого рода.
*
– говорит о том, что предшествующий символ повторяется ноль или более раз. Например используйте “.*” как wildcard.
|
– задаёт оператор логическое “или”. Например, (x|y) соответствует x или y.
– экранирует специальные символы ( ^ $ ! . * | ). Например, используйте “.” для индикации/экранирования буквальной точки — т. е. нам нужна именно точка.
.
– означает буквальную точку (экранированную).
/*
– ноль или более слешей.
.*
– ноль или более случайных чисел.
^$
– означает пустую строку.
^.*$
– стандартный паттерн, означающий «что угодно».
[^/.]
– означает один символ, который не слеш и не точка.
[^/.]+
– означает любое количество символов, которые не содержат слешей и точек.
http://
– это буквальное выражение — в этом случае буквальное означение строки — “http://”.
^domain.*
– означает строку, которая начинается на “domain”, после которого могут следовать любые символы.
^domain.com$
– определяет точную строку “domain.com”.
-d
– тестирует, является ли строка существующей директорией
-f
– тестирует, является ли строка существующим файлом
-s
– тестирует, не нулевого ли размера файл в тестовой строке
Коды заголовков перенаправления
301 – Перемещён навсегда
302 – Перемещён временно
403 – Запрещён
404 – Не найден
410 – Больше нет
Распространённые сниппеты .htaccess
Переписывание и Перенаправление
Обратите внимание: Подразумевается, что у вас установлен и включен mod_rewrite.
Включения базового переписывания
# включения базового переписывания RewriteEngine on
Адрес принудительно будет иметь www
RewriteEngine on RewriteCond %{HTTP_HOST} ^example.com [NC] RewriteRule ^(.*)$ http://www.example.com/\ [L,R=301,NC]
Адрес принудительно будет иметь www в общем виде
RewriteCond %{HTTP_HOST} !^$ RewriteCond %{HTTP_HOST} !^www. [NC] RewriteCond %{HTTPS}s ^on(s)| RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Адрес принудительно НЕ будет иметь www
RewriteEngine on RewriteCond %{HTTP_HOST} ^www.example.com [NC] RewriteRule ^(.*)$ http://example.com/\ [L,R=301]
Адрес принудительно НЕ будет иметь www в общем виде
RewriteEngine on RewriteCond %{HTTP_HOST} ^www. RewriteCond %{HTTPS}s ^on(s)|off RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www.)?(.+)$ RewriteRule ^ %1%3%{REQUEST_URI} [R=301,L]
Принудительное использование протокола HTTPS
RewriteEngine on RewriteCond %{HTTPS} !on RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} # Обратите внимание: Также рекомендуется включить HTTP Strict Transport Security (HSTS) # на вашем HTTPS веб-сайта для помощи в предотвращении атаки человек-по-середине. # See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security <IfModule mod_headers.c> Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" </IfModule>
Принудительное использование протокола HTTPS за прокси
Полезно если вы имеете прокси перед вашим сервером для TLS.
RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Принудительное добавление слешей на конце адреса
RewriteCond %{REQUEST_URI} /+[^.]+$ RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]
Удаление слешей на конце адреса
RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ /\ [R=301,L]
Удаление слешей на конце адреса в произвольных адресах
Этот сниппет будет перенаправлять пути, заканчивающиеся на слэши, на аналогичные без концевых слешей (кроме реальных директорий), например http://www.example.com/blog/ на http://www.example.com/blog. Это важно для SEO, поскльку рекомендуется иметь канонические URL для каждой страницы.
RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301]
Перенаправить на единичную страницу
Redirect 301 /oldpage.html http://www.example.com/newpage.html Redirect 301 /oldpage2.html http://www.example.com/folder/
Псевдоним (алиас) для единичной директории
RewriteEngine On RewriteRule ^source-directory/(.*) /target-directory/\ [R=301,L]
Псевдоним (алиас) пути до скрипта
FallbackResource /index.fcgi
В этом примере приведён файл index.fcgi, который лежит в каталоге и все запросы к этому каталогу, которые потерпели неудачу из-за отсутствия файла/директории будут перенаправлены на скрипт index.fcgi. Это хорошо, если вы хотите, чтобы baz.foo/some/cool/path обрабатывался скриптом baz.foo/index.fcgi (который также поддерживает запросы на baz.foo) в тоже время поддерживается baz.foo/css/style.css и другое подобное. Узнать истинный путь можно из переменной окружения PATH_INFO, которая доступна в скриптах.
RewriteEngine On RewriteRule ^$ index.fcgi/ [QSA,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.fcgi/\ [QSA,L]
Это менее эффективная версия директивы FallbackResource (поскольку использование mod_rewrite сложнее, чем просто обработка директивой FallbackResource), но также и более гибкое.
Перенаправление всего сайта
Redirect 301 / http://newsiteinternet.strikingly.com/
Этот способ не ломает ссылки. Это означает, что запрос www.oldsite.com/some/crazy/link.html превратится в www.newsite.com/some/crazy/link.html. Это крайне полезно, когда вы просто переносите сайт на новый домен.
Псевданимы (алиасы) чистых URL
Этот сниппет позволяет вам использовать «чистые» URL — вроде тех, что без PHP расширения, например, example.com/users вместо example.com/users.php.
RewriteEngine On RewriteCond %{SCRIPT_FILENAME} !-d RewriteRule ^([^.]+)$ $1.php [NC,L]
Развертывание пользовательских страниц ошибок
# использование пользовательских страниц ошибок
ErrorDocument 400 /errors/400.html ErrorDocument 401 /errors/401.html ErrorDocument 403 /errors/403.html ErrorDocument 404 /errors/404.html ErrorDocument 500 /errors/500.html
Обеспечиваем Универсальный Документ Ошибки (Universal Error Document)
# обеспечиваем универсальный документ ошибки RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^.*$ /dir/error.php [L]
Перенаправлять посетителей на временный сайт во время разработки сайта
# перенаправляем всех посетителей на альтернативный сайт, но сохраняем полный доступ для вас
ErrorDocument 403 Order deny,allow Deny from all Allow from 10.0.0.1
Безопасность
Запретить доступ для всех
## Apache 2.2 Deny from all ## Apache 2.4 Require all denied
Запретить доступ для всех, кроме вас
## Apache 2.2 Order deny,allow Deny from all Allow from xxx.xxx.xxx.xxx ## Apache 2.4 Require all denied Require ip xxx.xxx.xxx.xxx
xxx.xxx.xxx.xxx это ваш IP. Если вы замените последние три цифры, например, на 0/12, этим вы определите диапазон IP внутри этой сети, это оградит вас от проблемы перечислять по отдельности все разрешённые IP.
Разрешить доступ для всех кроме спамеров
## Apache 2.2 Order deny,allow Allow from all Deny from xxx.xxx.xxx.xxx Deny from xxx.xxx.xxx.xxy ## Apache 2.4 Require all granted Require not ip xxx.xxx.xxx.xxx Require not ip xxx.xxx.xxx.xxy
Запретить доступ к скрытым файлам и директориям
Скрытые файлы и директории (те, чьи имена начинаются с точки .) должны в большинстве, если не все, быть недоступны для других. Например к этим файлам относятся .htaccess, .htpasswd, .git, .hg…
RewriteCond %{SCRIPT_FILENAME} -d [OR] RewriteCond %{SCRIPT_FILENAME} -f RewriteRule "(^|/)." - [F]
Как вариант, вы можете выдавать ошибку Not Found (не найдено), чтобы не давать атакующему подсказку:
RedirectMatch 404 /..*$
Отклонить доступ к резервным копиям и исходным кодам
Эти файлы могут быть оставлены некоторыми редакторами text/html (вроде Vi/Vim) и представляют огромную брешь в безопасности, если станут общедоступными.
<FilesMatch "(.(bak|config|dist|fla|inc|ini|log|psd|sh|sql|swp)|~)$"> ## Apache 2.2 Order allow,deny Deny from all Satisfy All ## Apache 2.4 Require all denied </FilesMatch>
Отключение показа содержимого директорий
Options All -Indexes
Отключение показа ваших изображений (хотлинкинг) на других сайтах
RewriteEngine on # Удалите следующую строку, если вы также хотите заблокировать и с пустыми реферами RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^https?://(.+.)?example.com [NC] RewriteRule .(jpe?g|png|gif|bmp)$ - [NC,F,L] # Если вы хотите отображать баннер «заблокировано» на месте изображения, вставленного в другой сайт. # замените вышеприведённое правило на: # RewriteRule .(jpe?g|png|gif|bmp) http://example.com/blocked.png [R,L]
Отключение вставки ваших изображений на чужие сайты (хотлинкинг) для конкретных доменов
Иногда вы хотите отключить хотлинкинг только для некоторых плохих парней.
RewriteEngine on RewriteCond %{HTTP_REFERER} ^https?://(.+.)?badsite.com [NC,OR] RewriteCond %{HTTP_REFERER} ^https?://(.+.)?badsite2.com [NC,OR] RewriteRule .(jpe?g|png|gif|bmp)$ - [NC,F,L] # Если вы хотите отображать баннер «заблокировано» на месте изображения, вставленного в другой сайт. # замените вышеприведённое правило на: # RewriteRule .(jpe?g|png|gif|bmp) http://example.com/blocked.png [R,L]
Защита директории пароолем
Для начала вам нужно где-нибудь создать файл .htpasswd:
htpasswd -c /home/fellowship/.htpasswd boromir
Затем вы можете использовать этот файл для аутентификации:
AuthType Basic AuthName "Для входа пройдите аутентификацию" AuthUserFile /home/fellowship/.htpasswd Require valid-user
Защита паролем файла или нескольких файлов
AuthName "Для входа пройдите аутентификацию" AuthType Basic AuthUserFile /home/fellowship/.htpasswd <Files "one-ring.o"> Require valid-user </Files> <FilesMatch ^((one|two|three)-rings?.o)$> Require valid-user </FilesMatch>
Блокировать посетителей по Referrer (откуда пришли)
Этим мы закрываем доступ для всех пользователей, которые пришли от (были перенаправлены) с заданного домена.
RewriteEngine on # Options +FollowSymlinks RewriteCond %{HTTP_REFERER} somedomain.com [NC,OR] RewriteCond %{HTTP_REFERER} anotherdomain.com RewriteRule .* - [F]
Предотвращение вставки сайта во фреймы
Это не даёт веб-сайту быть вставленным во фреймы (например, быть размещённым в теге iframe), хотя ещё разрешён фрейминг для особых URI.
SetEnvIf Request_URI "/starry-night" allow_framing=true Header set X-Frame-Options SAMEORIGIN env=!allow_framing
Предотвращаем доступ к .htaccess
Добавьте следующий блок кода в ваш файл htaccess для добавления дополнительного слоя безопасности. Любые попытки получить доступ к файлу будут приводить к сообщению об ошибке 403. Конечно, ваш первый уровень защиты файлов htaccess заключается в настройке параметров разрешения на файлы через CHMOD на 644.
# защищаем файл htaccess <Files .htaccess> order allow,deny deny from all </Files>
Предотвращаем доступ к определённым файлам
Для ограничения доступа к определённым файлам, добавьте следующий блок кода и отредактируйте имя файла “file.txt”, заменив его на имя файла, который вы хотите защитить.
# prevent viewing of a specific file <files file.txt> order allow,deny deny from all </files>
Предотвращаем доступ к ряду типу файлов
Для ограничения доступа к ряду типов файлов, добавьте следующий блок кода и отредактируйте типы файлов в круглых скобках, заменив их на расширения тех файлов, которые вы хотите защитить.
<FilesMatch ".(htaccess|htpasswd|ini|phps|fla|psd|log|sh)$"> Order Allow,Deny Deny from all </FilesMatch>
Предотвращаем неавторизованный просмотр директорий
Закройте неавторизованный просмотр директории, указав серверу отвечать ошибкой “xxx Forbidden – Authorization Required” для любой запрос просмотра директории.
# отключение просмотра директорий Options All -Indexes
Наоборот, для включения просмотра директорий, используйте следующую директиву:
# включение просмотра директорий Options All +Indexes
Точно также это правило будет препятствовать просмотру содержимого папок на сервере:
# предотвращаем листинг каталогов IndexIgnore *
Директива IndexIgnore может использоваться для предотвращения отображения выбранных типов файлов:
# не даём отображаться в каталогах выбранным типам файлов IndexIgnore *.wmv *.mp4 *.avi *.etc
Меняем дефолтную (по умолчанию) индексную страницу
Это правило говорит серверу найти и выдать “business.html” в качестве дефолтного индекса директории. Это правило должно быть в файле htaccess корневой директории для который вы хотите заменить индексный файл по умолчанию.
# выдаём альтернативную дефолтную индексную страницу DirectoryIndex business.html
Это правило схожее, только в этом случае сервер будет сканировать корневую директорию на список файлов и выдаст первый из списка, который существует на сервере. Список читается слева направо:
# выдаём первую доступную альтернативу индексной страницы из ряда DirectoryIndex filename.html index.cgi index.pl default.htm
Маскируем расширение скрипта
Для увеличения безопасности, маскируйте скриптовый язык, заменив действительное расширение скрипта на фальшивое по вашему выбору
# обслуживать foo файлы в качестве php файлов AddType application/x-httpd-php .foo # обслуживать foo файлы в качестве cgi файлов AddType application/x-httpd-cgi .foo
Ограничение доступа к локальной сети
# ограничиваем доступа к локальной сети <Limit GET POST PUT> order deny,allow deny from all allow from 192.168.0.0/33 </Limit>
Безопасность директорий по IP адресами и/или доменам
Все IP адреса разрешены, кроме 1.1.1.1 и codeby.net
# разрешить всё, кроме представленных ниже <Limit GET POST PUT> order allow,deny allow from all deny from 1.1.1.1 deny from .*codeby.net.* </Limit>
Все IP адреса отклоняются кроме 1.1.1.1 и codeby.net:
# отклонить все, кроме представленных ниже <Limit GET POST PUT> order deny,allow deny from all allow from 1.1.1.1 allow from .*codeby.net.* </Limit>
Блокировка посетителей основываясь на ссылающемся домене
# блокируем посетителей, пришедших с определённых доменов <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_REFERER} scumbag.com [NC,OR] RewriteCond %{HTTP_REFERER} wormhole.com [NC,OR] RewriteRule .* - [F] </ifModule>
Запрещаем или разрешаем доступ к домену для определённого диапазона IP адресов
# блокируем диапазон IP по номеру CIDR <Limit GET POST PUT> order allow,deny allow from all deny from 10.10.0.0/16 deny from 10.0.0.0/8 </Limit>
Подобным образом разрешаем диапазон IP по номеру CIDR:
# разрешаем диапазон IP по номеру CIDR <Limit GET POST PUT> order deny,allow deny from all allow from 10.10.0.0/16 allow from 10.0.0.0/8 </Limit>
Блокируем IP диапазон сокращённой записью адресов
# блокировать IP диапазон сокращённой записью адресов <Limit GET POST PUT> order allow,deny allow from all deny from 10.0.0.1 deny from 10.0.0.* deny from 10.0.*.* deny from 10.*.*.* </Limit>
Разрешаем IP диапазон сокращённой записью адресов:
# разрешить IP диапазон сокращённой записью адресов <Limit GET POST PUT> order deny,allow deny from all allow from 10.0.0.1 allow from 10.0.0.* allow from 10.0.*.* allow from 10.*.*.* </Limit>
Блокируем или пропускаем множество IP адресов на одной строке
Сохраним немного места блокировкой множества IP адресов или диапазонов на одной строке
# блокируем два уникальных IP адреса deny from 10.0.0.1 10.0.0.2 # блокируем три диапазона IP адресов deny from 10.1 10.1.1 10.1.2
Пропускаем много IP адресов или диапазонов на одной строке:
# разрешаем два уникальных IP адреса allow from 10.0.0.1 10.0.0.2 # разрешаем три диапазона IP адресов allow from 10.1 10.1.1 10.1.2
Останавливаем хотлинкинг, выдавая вместо изображений другой контент
# останавливаем хотлинкинг, выдавая вместо изображений другой контент <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://(www.)?codeby.net/blogs/.*$ [NC] RewriteRule .*.(gif|jpg)$ [R,NC,L] </ifModule>
Для отображения стандартных (или пользовательских, если настроены) страниц ошибок вместо отвратительного изображения, заменить строку, содержащую RewriteRule в вышеприведённой директиве htaccess на следующую:
# выдаём стандартную страницу ошибки 403 запрета доступа RewriteRule .*.(gif|jpg)$ - [F,L]
Чтобы предоставить разрешения на вставку изображений с вашего сайта на определённые сайты, вставьте этот кусок кода после строки содержащей адрес домена (в нашем примере это “codeby.net”). Не забудьте заменить “goodsite.com” на настоящее доменное имя сайта:
# позволяем следующему сайту вставлять наши картинки RewriteCond %{HTTP_REFERER} !^http://(www.)?goodsite.com/.*$ [NC]
Блокируем плохих роботов, риперов сайтов и оффлайн браузеры
# отклоняем доступ для плохих роботов, риперов сайтов, оффлайн браузеров и другой неприятной сволочи RewriteBase / RewriteCond %{HTTP_USER_AGENT} ^Anarchie [OR] RewriteCond %{HTTP_USER_AGENT} ^ASPSeek [OR] RewriteCond %{HTTP_USER_AGENT} ^attach [OR] RewriteCond %{HTTP_USER_AGENT} ^autoemailspider [OR] RewriteCond %{HTTP_USER_AGENT} ^Xaldon WebSpider [OR] RewriteCond %{HTTP_USER_AGENT} ^Xenu [OR] RewriteCond %{HTTP_USER_AGENT} ^Zeus.*Webster [OR] RewriteCond %{HTTP_USER_AGENT} ^Zeus RewriteRule ^.* - [F,L]
Или, вместо отправки дружелюбного сообщения об ошибке, отправляйте этих плохих парней на веб-сайт по вашему выбору, просто заменив RewriteRule в последней строке на один из следующих примеров:
# отправляем их на адский веб-сайт по своему выбору RewriteRule ^.*$ https://www.nsa.gov/ [R,L]
Или отправляем их в виртуальную чёрную дыру фальшивых email адресов:
# отправьте их в виртуальную чёрную дыру фальшивых email адресов RewriteRule ^.*$ [R,L]
Вы также можете включить заданных рефереров для вашего чёрного списка с использованием HTTP_REFERER. Здесь мы используем “bad-domain.ru” в качестве нашего заблокированного примера, и мы используем “yourdomain” в качестве вашего домена (домена, для которого вы блокируете переходы с iaea.org):
RewriteCond %{HTTP_REFERER} ^http://www.bad-domain.ru$ RewriteRule !^http://[^/.].yourdomain.com.* - [F,L]
Защищаем паролем файлы, каталоги
# защищаем паролем один файл <Files secure.php> AuthType Basic AuthName "Prompt" AuthUserFile /home/path/.htpasswd Require valid-user </Files>
# защищаем паролем много файлов <FilesMatch "^(execute|index|secure|insanity|biscuit)*$"> AuthType basic AuthName "Development" AuthUserFile /home/path/.htpasswd Require valid-user </FilesMatch>
# защищаем паролем каталоги, в которых находится это правило htaccess AuthType basic AuthName "This directory is protected" AuthUserFile /home/path/.htpasswd AuthGroupFile /dev/null Require valid-user
# защищаем паролем каталоги от всех IP, кроме приведённого # положите этот файл htaccess в каталог, который вы хотите закрыть паролем AuthType Basic AuthName "Personal" AuthUserFile /home/path/.htpasswd Require valid-user Allow from 10.0.0.1 Satisfy Any
Требуем SSL (Secure Sockets Layer — уровень защищённых сокетов)
# требуется SSL SSLOptions +StrictRequire SSLRequireSSL SSLRequire %{HTTP_HOST} eq "domain.tld" ErrorDocument 403
# требуем SSL без mod_ssl RewriteCond %{HTTPS} !=on [NC] RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
Автоматически CHMOD различные типы файлов
# гарантируем CHMOD настройки для заданных типов файлов # помните, никогда не устанавливайте CHMOD 777 если вы не знаете, что вы делаете # файлы, которые требует доступа для записи, скорее должны быть CHMOD 766 нежели 777 # сохраняйте определённые файлы приватными, настроив их CHMOD на 400 chmod .htpasswd files 640 chmod .htaccess files 644 chmod php files 600
Маскировка расширения файла
Этот метод будет маскировать все типы файлов (т. е. расширения файлов) и представлять их как .php файлы (или с любым другими расширением по вашему выбору):
# маскируем все расширения как php ForceType application/x-httpd-php
Защищаем от атаки-в-обслуживании (DOS) ограничением размера выгружаемого файла
# защищаемся от атаки DOS, ограничив размер выгружаемого файла LimitRequestBody 10240000
Защищаем каталоги отключением исполнения скриптов
Предотвращаем вредоносное мозголомство посредством запрещения выполнения скриптов в каталогах, для этого добавьте следующие правила в имеющийся файл htaccess (отредактируйте типы файлов под ваши нужды):
# защищаем каталоги отключением исполнения скриптов AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi Options -ExecCGI
Запрашиваем у пользователей пароль на время разработки сайта
# запрос пароля для посетителей AuthType basic AuthName "This site is currently under construction" AuthUserFile /home/path/.htpasswd AuthGroupFile /dev/null Require valid-user # позволяем веб-мастерам и любым другим открытый доступ Order Deny,Allow Deny from all Allow from 1.1.1.1 Allow from favorite.validation/services/ Allow from googlebot.com Satisfy Any
Закрываем доступ к каталогу в заданные периоды времени
# закрываем доступ в полуночь RewriteCond %{TIME_HOUR} ^12$ RewriteRule ^.*$ - [F,L]
# предоставляем доступ во второй половине дня RewriteCond %{TIME_HOUR} ^(12|13|14|15)$ RewriteRule ^.*$ - [F,L]
Производительность
Сжатие текстовых файлов
<IfModule mod_deflate.c> # Принудительная компрессия для искромсанных заголовков. # <IfModule mod_setenvif.c> <IfModule mod_headers.c> SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)s*,?s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding </IfModule> </IfModule> # Сжимать всё исходящее с одним из следующих типов MIME-types # (для Apache версии ниже 2.3.7, вам не нужно включать `mod_filter` # и можете удалить фильтр `<IfModule mod_filter.c>` и `</IfModule>` строки # поскольку `AddOutputFilterByType` всё ещё в основных директивах). <IfModule mod_filter.c> AddOutputFilterByType DEFLATE application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/svg+xml image/x-icon text/css text/html text/plain text/x-component text/xml </IfModule> </IfModule>
Задать время истечения заголовков
Время истечения заголовков скажут браузеру, нужно ли данный файл запросить от сервера или просто вытащить его из кэша. Рекомендуется для статичного контента установить время истечения заголовков на что-нибудь далёкое в будущем. Если вы не контролируете изменение версий с помощью перебора основанного на файлах, подумайте о том, чтобы уменьшить время кэша для ресурсов вроде CSS и JS до чего-нибудь вроде одной недели.
<IfModule mod_expires.c> ExpiresActive on ExpiresDefault "access plus 1 month" # CSS ExpiresByType text/css "access plus 1 year" # Data interchange ExpiresByType application/json "access plus 0 seconds" ExpiresByType application/xml "access plus 0 seconds" ExpiresByType text/xml "access plus 0 seconds" # Favicon (cannot be renamed!) ExpiresByType image/x-icon "access plus 1 week" # HTML components (HTCs) ExpiresByType text/x-component "access plus 1 month" # HTML ExpiresByType text/html "access plus 0 seconds" # JavaScript ExpiresByType application/javascript "access plus 1 year" # Manifest files ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds" ExpiresByType text/cache-manifest "access plus 0 seconds" # Media ExpiresByType audio/ogg "access plus 1 month" ExpiresByType image/gif "access plus 1 month" ExpiresByType image/jpeg "access plus 1 month" ExpiresByType image/png "access plus 1 month" ExpiresByType video/mp4 "access plus 1 month" ExpiresByType video/ogg "access plus 1 month" ExpiresByType video/webm "access plus 1 month" # Web feeds ExpiresByType application/atom+xml "access plus 1 hour" ExpiresByType application/rss+xml "access plus 1 hour" # Web fonts ExpiresByType application/font-woff2 "access plus 1 month" ExpiresByType application/font-woff "access plus 1 month" ExpiresByType application/vnd.ms-fontobject "access plus 1 month" ExpiresByType application/x-font-ttf "access plus 1 month" ExpiresByType font/opentype "access plus 1 month" ExpiresByType image/svg+xml "access plus 1 month" </IfModule>
Отключение eTags
Удалив заголовок ETag, вы отключаете кэши и браузеры от возможности валидировать файлы, следовательно они будут вынуждены полагаться на ваши заголовки Cache-Control и Expires.
<IfModule mod_headers.c> Header unset ETag </IfModule> FileETag None
Множественное использование правил из httpd.conf
Сберегите своё время и силы по созданию дублирующих правил для множества виртуальных хостов. Пропешите их только один раз в вашем файле httpd.conf. Затем просто укажите целевому файлу (файлам) htaccess наследовать правила из httpd.conf, это делается следующей директивой:
RewriteOptions Inherit
Улучшите производительность через AllowOverride
# увеличить производительность отлючением allowoverride AllowOverride None
Повышение производительности через указание кодировки
Предотвратим определённую ошибку 500, указав кодировку по умолчанию. Примечание: замените “utf-8” на желаемую юкодировку.
# задаём кодировку по умолчанию AddDefaultCharset utf-8
Повышение производительности за счет сохранения полосы пропускания
Для повышения производительности на серверах с включённым PHP добавьте следующую директиву.
# повысить производительность за счет сохранения полосы пропускания <ifmodule mod_php4.c> php_value zlib.output_compression 16386 </ifmodule>
Отключаем подпись (сигнатуру) сервера
Здесь мы отключаем цифровую сигнатуру, которая в противном случае может служить для идентификации сервера.
# отключаем сигнатуру сервера ServerSignature Off
Улучшаем скорость сайта включением кеширования файлов
# кешируем изображения и флеш на один месяц <FilesMatch ".(flv|gif|jpg|jpeg|png|ico|swf)$"> Header set Cache-Control "max-age=2592000" </FilesMatch>
# кешируем текстовые, css, и javascript файлы на одну неделю <FilesMatch ".(js|css|pdf|txt)$"> Header set Cache-Control "max-age=604800" </FilesMatch>
# кешируем html и htm files на один день <FilesMatch ".(html|htm)$"> Header set Cache-Control "max-age=43200" </FilesMatch>
# реализуем минимальное кеширование на время разработки сайта <FilesMatch ".(flv|gif|jpg|jpeg|png|ico|js|css|pdf|swf|html|htm|txt)$"> Header set Cache-Control "max-age=5" </FilesMatch>
# явно отключаем кеширование для скриптов и других динамических файлов <FilesMatch ".(pl|php|cgi|spl|scgi|fcgi)$"> Header unset Cache-Control </FilesMatch>
# альтернативной метод кеширования файлов ExpiresActive On ExpiresDefault A604800 # 1 неделя ExpiresByType image/x-icon A2419200 # 1 месяц ExpiresByType application/x-javascript A2419200 # 1 месяц ExpiresByType text/css A2419200 # 1 месяц ExpiresByType text/html A300 # 5 минут # отключаем кеширование для скриптов и других динамических файлов <FilesMatch ".(pl|php|cgi|spl|scgi|fcgi)$"> ExpiresActive Off </FilesMatch>
* Конвертирование распространённых интервалов в секунды:
- 300 = 5 минут
- 2700 = 45 минут
- 3600 = 1 час
- 54000 = 15 часов
- 86400 = 1 день
- 518400 = 6 дней
- 604800 = 1 неделя
- 1814400 = 3 недели
- 2419200 = 1 месяц
- 26611200 = 11 месяцев
- 29030400 = 1 year = никогда не истечёт
Разное
Установка переменных PHP
php_value <key> <val> # Например: php_value upload_max_filesize 50M php_value max_execution_time 240
Установка временной зоны сервера (timezone)
Указываем серверу жить по часам определённой временной зоны
# установка временной зоны сервера SetEnv TZ Europe/Moscow
Установка адреса электронный почты администратора сервера
Задаём email по умолчанию для администратора сервера
# задать email по умолчанию для администратора сервера SetEnv SERVER_ADMIN default@domain.com
Устанавливаем язык по умолчанию
Это простой способ настроить язык по умолчанию для страниц, обслуживаемых вашим сервером (отредактируйте язык, в соответствии с вашими требованиями)
# установить язык по умолчанию DefaultLanguage ru
Объявляем особые/дополнительные типы MIME
# добавляем различные типы mime AddType application/x-shockwave-flash .swf AddType video/x-flv .flv AddType image/x-icon .ico
Разрешаем только запросы GET и PUT
# лимитируем серверные запросы методами GET и PUT Options -ExecCGI -Indexes -All RewriteEngine on RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK|OPTIONS|HEAD) RewriteRule .* - [F]
Выдаём разные файлы в зависимости от метода запроса
# сервер выдаёт различные файлы в зависимости от метода запроса Script PUT /cgi-bin/upload.cgi Script GET /cgi-bin/download.cgi
Устанавливаем настройку кодировки и других заголовков без мета тегов
# отправляем язык тега и кодировку по умолчанию AddType 'text/html; charset=UTF-8' html AddDefaultCharset UTF-8 DefaultLanguage ru
Выполнение различных скриптов через скрипт cgi
Для тех особых случаев, когда определенные типы файлов должны быть обработаны некоторыми конкретными скриптами CGI
# обработать все png через png-script.cgi Action image/png /cgi-bin/png-script.cgi
Включение символьных ссылок
Включите символьные ссылки (symlinks) добавлением следующей директивы к файлу htaccess целевой директории. Примечание: для работы директивы FollowSymLinks должна быть включена опция AllowOverride в конфигурационном файле сервера.
# включение символьных ссылок Options +FollowSymLinks
Включение AllowOverride
Для улучшения производительности рекомендуется включать AllowOverride только в отдельной директории или директориях для которых это нужно. В следующем отрезке кода мы включаем привилегии AllowOverride только в заданной директории.
# включение привилегий allowoverride <Directory /www/replace/this/with/actual/directory> AllowOverride Options </Directory>
Комментируем файл htaccess
# это комментарий # каждая строка комментария должна иметь свой собственный символ решётки # используйте только алфавитные символы, а также тире - и подчёркивание _
Переименование файла htaccess
Эта директива должна быть размещена в конфигурационном файле сервера, иначе она не будет работать
# переименовать файлы htaccess AccessFileName ht.access
Пользовательские страницы ошибок
ErrorDocument 500 "Хьюстон, у нас проблема." ErrorDocument 401 ErrorDocument 404 /errors/halflife3.html
Принудительная загрузка
Иногда вы хотите, чтобы браузер загружал некий контент вместо отображения его.
<Files *.md> ForceType application/octet-stream Header set Content-Disposition attachment </Files>
Предотвращение загрузки
Иногда вы хотите принудить браузер отображать контент вместо его загрузки.
<FilesMatch ".(tex|log|aux)$"> Header set Content-Type text/plain </FilesMatch>
Разрешить междоменные шрифты
CDN-served webfonts не работают в Firefox или IE из-за CORS. Этот сниппет решает эту проблему.
<IfModule mod_headers.c> <FilesMatch ".(eot|otf|ttc|ttf|woff|woff2)$"> Header set Access-Control-Allow-Origin "*" </FilesMatch> </IfModule>
Автоматическая кодировка UTF-8
Ваш текстовый контент должен всегда быть закодирован в UTF-8, так?
# Использовать кодировку UTF-8 для всего на сервере text/plain или text/html AddDefaultCharset utf-8 # Принудительно использовать UTF-8 для ряда форматов файлов AddCharset utf-8 .atom .css .js .json .rss .vtt .xml
Переключение на другую версию PHP
Если у вас общий хостинг, есть шанс, что установлена более чем одна версия PHP, а иногда вам нужна конкретная версия для вашего веб-сайта. Следующий сниппет должен переключить PHP версию для вас
AddHandler application/x-httpd-php55 .php # В качестве альтернативы вы можете использовать AddType AddType application/x-httpd-php55 .php
Посмотрите “Хостинг с выбором версии PHP”.
Отключить Internet Explorer Compatibility View
Просмотр в режиме совместимости в IE может оказать влияние на как отображаются некоторые сайты. Следующий сниппет должен принудить IE использовать движок Edge Rendering и отключить просмотр в режиме совместимости.
<IfModule mod_headers.c> BrowserMatch MSIE is-msie Header set X-UA-Compatible IE=edge env=is-msie </IfModule>
Работа с изображениями WebP
Если поддерживаются WebP и изображения с расширениями .webp и теми же именами найдены в том же месте где и изображения jpg/png, которые нужно отправить, то тогда вместо них отправляются изображения WebP.
RewriteEngine On RewriteCond %{HTTP_ACCEPT} image/webp RewriteCond %{DOCUMENT_ROOT}/\.webp -f RewriteRule (.+).(jpe?g|png)$ $1.webp [T=image/webp,E=accept:1]
Использование базовой проверки правописания URL
# автоматически корректируем простые орфографические ошибки <IfModule mod_speling.c> CheckSpelling On </IfModule>
Указываем браузеру загружать мультимедийные файлы, а не отображать их
# говорим браузеру загружать мультимедийные файлы AddType application/octet-stream .avi AddType application/octet-stream .mpg AddType application/octet-stream .wmv AddType application/octet-stream .mp3
Указываем серверу отображать исходный код для динамических типов файлов
RemoveHandler cgi-script .pl .py .cgi
Активируем SSI для файловых типов HTML/SHTML
# активировать SSI для HTML и или SHTML типов файлов AddType text/html .html AddType text/html .shtml AddHandler server-parsed .html AddHandler server-parsed .shtml AddHandler server-parsed .htm
Даём доступ CGI для конкретной директории
# дать CGI доступ для конкретной директории Options +ExecCGI AddHandler cgi-script cgi pl # все скрипты в директории могут использовать следующее SetHandler cgi-script
Отключаем magic_quotes_gpc для серверов с PHP
# отключить magic_quotes_gpc для серверов с PHP <ifmodule mod_php4.c> php_flag magic_quotes_gpc off </ifmodule>
Включение MD5 digests
Примечание: включение этой опции может стать причиной относительного замедления производительности сервера
# включение MD5 digests через ContentDigest ContentDigest On
hi
AddHandler uygulaması / x-httpd-php55 .php
# Alternatif olarak AddType’ı kullanabilirsiniz
AddType uygulaması / x-httpd-php55 .php
web site add
i used site opened download broken , godaddy authorized didn’t help
how can i fix it again
thanks