
В этой статье собраны полезные примеры кода в файле .htaccess для оптимизации сайта и реализации таких задач как блокирование доступа к файлу, защита паролем папки или сайта, бан по IP или сети, редиректы, gzip сжатие, кэширование и т.д и т.п.
.htaccess — файл дополнительной конфигурации веб-сервера Apache, и подобных серверов. Позволяет задавать большое количество параметров для работы веб-сервера в отдельных каталогах или по всему сайту в целом.
Защита паролем папки/сайта
Для этого понадобится два файла, файл .htaccess кладем в папку, которую нужно защитить паролем и прописать в нем код:
AuthType Basic AuthName "Password Protected Area" AuthUserFile /path/to/.htpasswd Require valid-user
В файле, который указан в коде - "/path/to/.htpasswd", прописываем логин/пароль:
testuser:Passwordofuser
Блокируем доступ к файлу через htaccess
Если вам нужно заблокировать доступ к какому-либо файлу, например файл xmlrpc.php, который часто используют для взлома wordpress-сайтов, то пропишите в .htaccess следующий код:
# Protect Files <Files xmlrpc.php> Order Allow,Deny Deny from all </Files>
Или вот так, если нужно заблокировать файлы в подпапке:
RedirectMatch 403 ^.*/wp-login.php$
Или вот так:
RewriteRule ^.*/wp-login\.php$ - [F,L]
Имейте в виду, если у вас используется nginx, то правила в htaccess не влияют на статические файлы, которые nginx обрабатывает.
Запрет POST запросов
Запретить POST запросы к URL с wp-login.php:
#Запрет POST запросов к wp-login кроме IP 33.33.33.222 RewriteCond %{REQUEST_METHOD} POST RewriteCond %{REMOTE_ADDR} !^33\.33\.33\.222$ RewriteCond %{REQUEST_URI} ^/wp-login\.php$ RewriteRule .? - [F]
Злоумышленники любят в своих атаках использовать Post запросы.
Можно защититься от спамеров и ботов более хитрым способом: они часто не используют заголовки HTTP_REFERER и HTTP_USER_AGENT, в отличии от обычных браузеров, а значит можно запретить все POST запросы где в HTTP_REFERER не указан ваш сайт или же нет HTTP_USER_AGENT, пишем код в файл htaccess:
# Stop spam attack logins and comments <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_METHOD} POST RewriteCond %{REQUEST_URI} .(wp-comments-post|wp-login)\.php* RewriteCond %{HTTP_REFERER} !.*example.com.* [OR] RewriteCond %{HTTP_USER_AGENT} ^$ RewriteRule (.*) - [F,L] </ifModule>
Бан по IP или сети при помощи htaccess
# бан по ip order allow,deny deny from 131.254.150.26 deny from 54.172.19.226 deny from 10.0.0.0/24 allow from all
Переадресация для wordpress сайта с http на https
Благодаря этому коду в файле .htaccess я смог настроить на своем wordpress сайте (в режиме мультисайта) переадресацию с http на https:
# BEGIN WordPress RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] #for SSL RewriteCond %{HTTP:SSL} !=1 [NC] RewriteRule ^(.*) https://elims.org.ua/$1 [L,R=301]
Включение HSTS
Строгая транспортная безопасность HTTP (HSTS) — это механизм политики веб-безопасности, с помощью которого веб-сервер указывает, что он поддерживает подключения только по протоколу HTTPS. Для включения HSTS пропишите в файле .htaccess код:
<IfModule mod_headers.c> # this domain should only be contacted in HTTPS for the next 12 months Header set Strict-Transport-Security "max-age=31536000" env=HTTPS </IfModule>
Запрещаем отображать сайт в iframe
Может возникнуть ситуация когда какие-либо сайты начинают отображать контент вашего сайта во frame-блоках, цели могут быть разные: мошенничество, clickjacking, воровство вычислительных ресурсов (чтобы не нагружать свой сервер) или просто воровство контента. Защититься можно от этого при помощи вот такого кода в файле htaccess:
<IfModule mod_headers.c> Header always append X-Frame-Options SAMEORIGIN </IfModule>
Если эта защита не сработает, значит модуль mod_headers на хостинге не включен.
Редирект стандартной ленты WordPress на Feedburner
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_USER_AGENT} !FeedBurner [NC] RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC] RewriteRule ^themes/feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/elims [R=302,NC,L] </IfModule>
301 redirect в htaccess между страницами
Тут все просто:
Redirect 301 /index.php http://site.ru/ Redirect 301 /folder /folder2/folder3
htaccess и 301 редирект с WWW на без WWW
Options +FollowSymLinks RewriteEngine On RewriteCond %{HTTP_HOST} ^www.sait\.ru$ [NC] RewriteRule ^(.*)$ http://sait.ru/$1 [R=301,L]
301 редирект с одного домена на другой
Если сайт изменил свой домен и не хочется потерять вес страниц, то замените содержимое .htaccess (файл находится в корне папки старого домена), на следующее (вместо new-site.ua укажите новый домен):
<FilesMatch "robots.txt$"> RewriteEngine off </FilesMatch> Options +FollowSymLinks RewriteEngine on RewriteRule (.*) http://new-site.ua/$1 [R=301,L]
Увеличиваем количество выделяемой ОЗУ
Бывает можно встретить вот такую ошибку:
Fatal error: Allowed memory size of 41943040 bytes exhausted (tried to allocate 72 bytes) in
Она говорит о том, что CMS не хватает выделенной под нее оперативной памяти.
Один из способов увеличения объема выделенной оперативной памяти - через файл .htaccess, пишем в нем:
php_value memory_limit 64M
Если не помогло, значит хостинг запретил изменять php параметры через htaccess
Включаем GZip сжатие
Вот такой код для файла htaccess рекомендует WordPress.org:
<IfModule mod_deflate.c> # Insert filters AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/x-javascript AddOutputFilterByType DEFLATE application/x-httpd-php AddOutputFilterByType DEFLATE application/x-httpd-fastphp AddOutputFilterByType DEFLATE image/svg+xml # Drop problematic browsers BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html # Make sure proxies don't deliver the wrong content Header append Vary User-Agent env=!dont-vary </IfModule>
Или почти такой же код рекомендует известный сайт gtmetrix.com:
<IfModule mod_deflate.c> # Compress HTML, CSS, JavaScript, Text, XML and fonts AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/vnd.ms-fontobject AddOutputFilterByType DEFLATE application/x-font AddOutputFilterByType DEFLATE application/x-font-opentype AddOutputFilterByType DEFLATE application/x-font-otf AddOutputFilterByType DEFLATE application/x-font-truetype AddOutputFilterByType DEFLATE application/x-font-ttf AddOutputFilterByType DEFLATE application/x-javascript AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE font/opentype AddOutputFilterByType DEFLATE font/otf AddOutputFilterByType DEFLATE font/ttf AddOutputFilterByType DEFLATE image/svg+xml AddOutputFilterByType DEFLATE image/x-icon AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/javascript AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/xml # Remove browser bugs (only needed for really old browsers) BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html Header append Vary User-Agent </IfModule>
Кэширование статического контента в браузере
Следующий пример для htaccess использует расширение mod_expires и включает кеширование всего контента кроме некоторых форматов файлов:
FileETag MTime Size ExpiresActive On ExpiresDefault "access plus 10 years" <FilesMatch \.(html|xhtml|xml|shtml|phtml|php)$> ExpiresActive Off </FilesMatch>
Или наоборот кэшируем лишь определенные форматы:
FileETag MTime Size <ifmodule mod_expires.c> <filesmatch ".(jpg|jpeg|gif|png|ico|css|js)$"> ExpiresActive on ExpiresDefault "access plus 1 month" </filesmatch> </ifmodule>
Вот еще пример кода:
ExpiresActive On ExpiresDefault A0 # 1 YEAR <FilesMatch "\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$"> ExpiresDefault A29030400 </FilesMatch> # 1 WEEK <FilesMatch "\.(jpg|jpeg|png|gif|swf)$"> ExpiresDefault A604800 </FilesMatch> # 3 HOUR <FilesMatch "\.(txt|xml|js|css)$"> ExpiresDefault A10800" </FilesMatch>
Следующие директивы, как альтернатива предыдущему методу, используют расширение Apache под названием mod_header и регламентируют, как клиент будет хранить файлы в кэше, каждая директива говорит клиенту хранить типы файлов в течении разного интервала времени:
# 1 YEAR <FilesMatch "\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$"> Header set Cache-Control "max-age=29030400, public" </FilesMatch> # 1 WEEK <FilesMatch "\.(jpg|jpeg|png|gif|swf)$"> Header set Cache-Control "max-age=604800, public" </FilesMatch> # 3 HOUR <FilesMatch "\.(txt|xml|js|css)$"> Header set Cache-Control "max-age=10800" </FilesMatch> # NEVER CACHE <FilesMatch "\.(html|htm|php|cgi|pl)$"> Header set Cache-Control "max-age=0, private, no-store, no-cache, must-revalidate" </FilesMatch>
Если часть CSS и JS-файлов, изображений создаются динамически, например изображения предпросмотра и ряд стилей могут создаваться при помощи PHP на лету, то выручит вот такой код:
ExpiresActive On ExpiresByType text/css A315360000
Закрываем индексацию через .htaccess
Например закрываем индексацию изображений:
<FilesMatch "\.(gif|jpe?g|png)$"> Header set X-Robots-Tag "noindex" </FilesMatch>
Добавление или удаление слэша в конце url
Добавляем слеш в конце url
Если нужно редиректить например с адреса http://elims.org.ua/test на адрес http://elims.org.ua/test/, то используйте следующий код:
RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !(.*)/$ RewriteRule ^(.*[^/])$ $1/ [L,R=301]
Удаляем слеш в конце url
Если нужно редиректить например с адреса http://elims.org.ua/test/ на адрес http://elims.org.ua/test, то используйте следующий код:
RewriteEngine On RewriteBase / RewriteCond %{HTTP_HOST} (.*) RewriteCond %{REQUEST_URI} /$ [NC] RewriteRule ^(.*)(/)$ $1 [L,R=301]
Отключение вывода ошибок php
Если не скрывать вывод ошибок php, то сайт становится подтвержденным уязвимости "Full Path Disclosure", ее суть заключается в том, что благодаря ошибкам можно узнать полный путь к файлам вызывающим эти ошибки, то есть узнать структуру папок на хостинге, чтобы этого не было в htaccess можно отключить вывод php ошибок:
php_flag display_errors off
если же это вызвало ошибку "internal server error", то удалить эту строку и отключить вывод ошибок в файле "php.ini" при помощи строки:
display_errors = 'off'
Или отключите в админке хостинга, например на моем Хостинг Украина это отключается через админку.
Найс, буду юзать
Добавляю код в htaccess:
#for SSL
RewriteCond %{HTTP:SSL} !=1 [NC]
RewriteRule ^(.*) https://elims.org.ua/$1 [L,R=301]
Исправляю имя домена на своё и получаю циклическую переадресацию. Где я туплю?
Разобрался :) Не знал, что это надо в отдельный оборачивать.
Добрый день всем ВМ)
Почитал тему, что то свою проблему не нашел(
Как известно в джумле материал может открываться по ид, соответственно полный юрл в моем случае не нужен.
например sait.ru/mail-agent/9-afisha/12-torty-na-zakaz-pirozhnye — где 12 ид материала
Как сделать чтобы без писанины после ид, вот так: sait.ru/mail-agent/9-afisha/12
Заранее спс!
Большое спасибо за рекомендации и ссылки на сайты для проверки сжатия gzip на лету все сделал, успеха вам и вашему сайту
> php_value memory_limit 64M
Директива php_value в .htaccess приведет к 500 ошибке на сервере, где php запускается в режиме FastCGI.
Вместо этого, следует использовать директиву вида:
memory_limit = «128M»