.htaccess для Joomla - правильная настройка (ускорение, редирект, кэширование)

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

Основной функционал файла htaccess

С помощью данного файла мы можем настроить редирект (грамотную переадресацию поисковых ботов и посетителей), указать кэш (css, js, изображения и др.), блокировка MySql и файловых инъекций, запрет на доступ к отдельным папкам и каталогам, установка блокировки пользователей по ip, самостоятельная обработка ошибок web-сервера и другие возможности. 

 Перед самой настройкой файла .htaccess, нам необходимо проверить настройки SEO в админ-панели Joomla. Итак заходим в "админ-панель" - "сайт" - "общие настройки".

Настройка ЧПУ и включение mod_rewrite

  • "Включить SEF (ЧПУ)" - ставим Да. Делает ссылки человеко-понятными, из плюсов можно отметить - улучшение для поисковой оптимизации, минусы - создает дубли страниц.

  • "Перенаправление URL" - ставим Да. Внимание - прежде чем включить данную опцию, всем пользователям сервера Apache (используется на большинстве виртуальных хостингах) - следует переименовать файл htaccess.txt в файл .htaccess (впереди обязательно точка, не имеет расширения).

  • "Добавлять суффикс к URL" - устанавливаем по желанию (я поставил нет). Если поставить Да - то к каждому url-адресу будет добавляться суффикс, в зависимости от типа документа. Например html, php и другие.

  • "Алиасы в Unicode" - ставим Нет.

  • "Включить название сайта в заголовок страницы" - по желанию (После, До, Нет).

Теперь давайте проверим включен ли системный плагин SEF. Заходим в "Расширения" - "Менеджер плагинов" и ищем плагин "Система-SEF". Если он выключен, то его необходимо активировать.

системный плагин SEF

Настройка файла .htaccess для Joomla

Сразу хочу отметить, что предлагаемый мной .htaccess не является панацеей, для всех web-ресурсов на cms Joomla, но на начальном этапе вполне работоспособный и достаточно качественный.

Итак первой секцией нам необходимо задать основные опции:

 Options +FollowSymLinks -Indexes

  • Директива Options - определяет какие свойства сервера доступны. Опции со знаком "+" будут добавлены к опциям включенным на данный момент, со знаком "-" - будут удалены.

  • +FollowSymLinks - данная опция позволяет нам использовать символические ссылки на каталоги или файлы, которые не находятся в пределах корня вашего сайта.

  • -Indexes - запрет на листинг каталогов, если в них нет индексного файла (например index.html - заглушка).

AddDefaultCharset utf-8

  • Кодировка по умолчанию.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} !^POST
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteCond %{SERVER_PORT}>s ^(443>(s)|[0-9]+>s)$
RewriteRule ^index\.php$ http%2://vashsayt.com/ [R=301,L]
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
</IfModule>

  • <IfModule mod_rewrite.c> - данное условие предупреждает 500 ошибку сервера, которая может возникнуть, если у вашего хостера не будет установлен модуль mod_rewrite, который в свою очередь входит в сборку сервера Apache по умолчанию.

  • RewriteEngine On - Данная секция отвечает за включения mod_rewrite, который в свою очередь используется, для SEF, а также для перенаправления пользователей по нужным адресам.

  • RewriteBase / - Корневая директория, куда устанавливается Joomla.

  • Следующие 4 строки - отвечают за перенаправление со страниц с /index.php на станицы без index.php. Например пользователь зайдет на http://vashsayt.com/index.php - в этом случае его перебросит (301 редирект) на http://vashsayt.com. Избавление от дублей страниц.

  • Последующие 2 строки - отвечают за перенаправление пользователей с www.vashsayt.comна vashsayt.com. Также убирает дубли страниц.

  • </IfModule> - конец условия.

DirectoryIndex index.php

  • Если у вас в папке находится файлы index.php и index.html, то тогда данная секция укажет серверу - какой файл является более главным (в нашем случае index.php).

 

Настройка php на хостинге:

<ifModule mod_php.c>
php_value register_globals 0
php_value safe_mode 0
php_value allow_url_fopen 0
php_value display_errors 0
php_value file_uploads 1
php_value magic_quotes_gpc 1
php_value magic_quotes_runtime 0
php_value upload_max_filesize 20M
php_value post_max_size 10M
php_value max_execution_time 100
php_flag register_globals Off
php_flag display_errors Off
php_flag file_uploads On
php_flag allow_url_fopen off
php_flag magic_quotes_gpc On
php_flag magic_quotes_runtime Off
</ifModule>

  • <ifModule mod_php.c> - условие которое предупреждает от 500 ошибки, если на сервере не будет установлен модуль mod_php.

  • php_value register_globals 0 - используется для повышения безопасности. Отключает режим register_globals в PHP.

  • php_value safe_mode 0 - отключение потенциально опасной директивы.

  • php_value allow_url_fopen 0 - отключение потенциально опасной директивы.

  • php_value display_errors 0 - отключение вывода ошибок в браузер.

  • php_value file_uploads 1 - загрузка по 1 файлу за раз (методом post).

  • php_value magic_quotes_gpc 1 - функция которая автоматически экранирует данные GET, POST, COOKIE.

  • php_value magic_quotes_runtime 0 - избавление от ошибок, "магические кавычки"

  • php_value upload_max_filesize 20M - устанавливаем максимальное значение загружаемых файлов (по умолчанию в основном 8М)

  • php_value post_max_size 10M -  максимальное значение постинга (по умолчанию в основном 2М)

  • php_value max_execution_time 100 - максимальный лимит времени (в секундах), для выполнения скриптов (по умолчанию в основном 30 секунд).

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

Правила обработки запросов для блокировки распространенных эксплоитов:

RewriteCond %{QUERY_STRING} proc/self/environ [OR]
RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|\%3D) [OR]
RewriteCond %{QUERY_STRING} base64_(en|de)code\(.*\) [OR]
RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
RewriteRule .* index.php [F]

  • RewriteCond %{QUERY_STRING} proc/self/environ [OR] - блокировка атак на ваш сайт.

  • RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|\%3D) [OR] - блокировать запрос, который пытается установить значение mosConfig непосредственно через URL.

  • RewriteCond %{QUERY_STRING} base64_(en|de)code\(.*\) [OR] - заблокировать запрос, который пробует испортить base64_encode через URL

  • RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3E) [NC,OR] - заблокировать запрос, который содержащий тег <script> в URL.

  • RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR] - заблокировать запрос, который пробует установить значение глобальных переменных PHP через URL.

  • RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) - заблокировать запрос, который пробует изменить переменную _REQUEST через URL.

  • RewriteRule ^(.*)$ index.php [F] - перенаправлять заблокированные запросы на страницу 403 с запрещенными ошибками.

 

Блокировка прямого доступа к ядру:

RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} \.php|\.ini|\.xml [NC]
RewriteCond %{REQUEST_URI} \/components\/ [OR]
RewriteCond %{REQUEST_URI} ^\/includes\/|^\/administrator\/includes\/ [OR]
RewriteCond %{REQUEST_URI} \/language\/ [OR]
RewriteCond %{REQUEST_URI} \/libraries\/ [OR]
RewriteCond %{REQUEST_URI} \/modules\/ [OR]
RewriteCond %{REQUEST_URI} \/plugins\/ [OR]
RewriteCond %{REQUEST_URI} \/templates\/ [OR]
RewriteCond %{REQUEST_URI} \/cli\/
RewriteRule ^(.*)$ index.php [R=404,L]

  • "RewriteCond %{REQUEST_FILENAME} -f" - условие, которое указывает, что все существующие файлы не будут обрабатываться регулярными выражениями.

  • Все остальные строки отвечают за блокировку и перенаправление через index.php, при попытке получить прямой доступ к файлам с расширением .php, .ini, xml и указанным выше папкам.

  • NC - регистро-независимая проверка.

  • OR - условие которое сопоставляется с другими по правилу ИЛИ.

 

Строки ниже, отвечают за блокирование MySQL инъекций:

RewriteCond %{query_string} concat.*\( [NC,OR] RewriteCond %{query_string} union.*select.*\( [NC,OR] RewriteCond %{query_string} union.*all.*select [NC] RewriteRule ^(.*)$ index.php [F,L] 

 

Код отвечающий за блокировку файловых инъекций:

RewriteCond %{REQUEST_METHOD} GET RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http:// [OR] RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=(\.\.//?)+ [OR] RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=/([a-z0-9_.]//?)+ [NC] RewriteRule .* - [F]

 

Запрет доступа к файлам htaccess.txt, configuration.php и php.ini:

 RewriteRule ^(htaccess\.txt|configuration\.php-dist|php\.ini)$ - [F]

 

Раздел SEF ядра Joomla:

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteCond %{REQUEST_URI} !^/index\.php
RewriteCond %{REQUEST_URI} /component/|(/[^.]*|\.(php|html?|feed|pdf|raw|ini|zip|json|file|vcf))$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]


Увеличение скорости сайта с помощью правил в файле .htaccess

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

 

 

Сжатие:

Сервер Apache может использовать два модуля для сжатия - mod_deflate и mod_gzip. Почти у всех провайдеров они есть по умолчанию, хотя может и не быть. mod_deflate - наиболее распространенный модуль, его мы и рассмотрим первым.

<ifModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/css
text/javascript application/javascript application/x-javascript
</ifModule>

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

Следующий модуль для Gzip сжатия - mod_gzip. Для корректной работы модуля, добавьте следующие строки в файл .htaccess.

<IfModule mod_gzip.c>
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 rspheader ^Content-Encoding:.*gzip.*
</IfModule>

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

Примечание: Используя данные модули сжатия, вы сможете существенно ускорить загрузку страниц вашего сайта, так как все, что можно будет сжать - будет сжиматься у вас на сервере и передаваться в браузеры пользователей, но этим самым действием вы увеличите нагрузку на свой сервер. Если у вас в запасе присутствуют дополнительные мощности на сервере - то включаем обязательно, а если нагрузка практически на пике - то стоит быть осторожным, что бы хостер не заблокировал ваш ресурс. Нагрузка может подскочить на 20-60%. 

 

Кэширование:

Кэширование страниц можно включить используя два замечательных модуля - mod_headersи mod_expires. В основном у провайдера стоит хоть один из этих модулей, но во избежание ошибки 500, мы будем использовать проверку наличия модулей.

<ifModule mod_headers.c>
#кэшировать 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
</FilesMatch>
</ifModule>

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

Рассмотрим следующий модуль отвечающий за кэширование страниц - mod_expires:

<ifModule mod_expires.c>
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"
</ifModule>

Все закомментированные строки можно удалить.

Ниже я выложил готовый файл .htaccess. Если есть вопросы - пишите в комментариях.

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

---------------------------------------------------------------------------------------------------------------------------------

 

##файл .htaccess для Joomla. Создан на сайте http://max-joomla.ru

##Может быть закомментировано, если вызывает ошибку сервера. Возможность использовать 
##символические ссылки на каталоги или файлы, которые не находятся в пределах корня 
##вашего сайта. Запрет на листинг каталогов. 
Options +FollowSymLinks -Indexes
##

## Кодировка по умолчанию
AddDefaultCharset utf-8
##

 

## Включение модуля mod_rewrite
<IfModule mod_rewrite.c>
RewriteEngine On
##

##Корневая директория - начало
RewriteBase /
##Корневая директория конец

##Редирект с index.php на / - начало
RewriteCond %{THE_REQUEST} !^POST
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteCond %{SERVER_PORT}>s ^(443>(s)|[0-9]+>s)$
RewriteRule ^index\.php$ http%2://vash-sayt.com/ [R=301,L]
##Редирект с index.php на / - конец

 

##Редирект с www на без www - начало
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
##Редирект с www на без www - конец

 

</IfModule>
## Конец модуля mod_rewrite

 

##Индексная страница
DirectoryIndex index.php
##

 

## Настройки хостинга - начало
<ifModule mod_php.c>
php_value register_globals 0
php_value safe_mode 0
php_value allow_url_fopen 0
php_value display_errors 0 
php_value file_uploads 1
php_value magic_quotes_gpc 1
php_value magic_quotes_runtime 0
php_value upload_max_filesize 20M
php_value post_max_size 10M
php_value max_execution_time 100
php_flag register_globals Off
php_flag display_errors Off
php_flag file_uploads On
php_flag allow_url_fopen off
php_flag magic_quotes_gpc On
php_flag magic_quotes_runtime Off
</ifModule>
## Настройки хостинга - конец

 

## Правила обработки запросов для блокировки распространенных эксплоитов - начало
RewriteCond %{QUERY_STRING} proc/self/environ [OR]
RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|\%3D) [OR]
RewriteCond %{QUERY_STRING} base64_(en|de)code\(.*\) [OR]
RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
RewriteRule .* index.php [F]
## Правила обработки запросов для блокировки распространенных эксплоитов - конец

 

##Блокировка прямого доступа к ядру - начало
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} \.php|\.ini|\.xml [NC]
RewriteCond %{REQUEST_URI} \/components\/ [OR]
RewriteCond %{REQUEST_URI} ^\/includes\/|^\/administrator\/includes\/ [OR]
RewriteCond %{REQUEST_URI} \/language\/ [OR]
RewriteCond %{REQUEST_URI} \/libraries\/ [OR]
RewriteCond %{REQUEST_URI} \/modules\/ [OR]
RewriteCond %{REQUEST_URI} \/plugins\/ [OR]
RewriteCond %{REQUEST_URI} \/templates\/ [OR]
RewriteCond %{REQUEST_URI} \/cli\/
RewriteRule ^(.*)$ index.php [R=404,L]
##Блокировка прямого доступа к ядру - конец

 

##Блокировка MySQL инъекций - начало
RewriteCond %{query_string} concat.*\( [NC,OR]
RewriteCond %{query_string} union.*select.*\( [NC,OR]
RewriteCond %{query_string} union.*all.*select [NC]
RewriteRule ^(.*)$ index.php [F,L]
##Блокировка MySQL инъекций - конец

 

##Блокировка файловых инъекций - начало 
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http:// [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=(\.\.//?)+ [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=/([a-z0-9_.]//?)+ [NC]
RewriteRule .* - [F]
##Блокировка файловых инъекций -конец

 

## Запретит доступа к htaccess.txt, configuration.php и php.ini
RewriteRule ^(htaccess\.txt|configuration\.php-dist|php\.ini)$ - [F]
##

 

## Раздел SEF ядра Joomla - начало
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteCond %{REQUEST_URI} !^/index\.php
RewriteCond %{REQUEST_URI} /component/|(/[^.]*|\.(php|html?|feed|pdf|raw|ini|zip|json|file|vcf))$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]
##Раздел SEF ядра Joomla - конец

 

##Ускорение загрузки сайта

 

##Gzip сжатие с помощью модуля mod_deflate - начало
<ifModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/css text/javascript application/javascript application/x-javascript 
</ifModule>
##Gzip сжатие с помощью модуля mod_deflate - конец

 

##Gzip сжатие с помощью модуля mod_gzip - начало
<IfModule mod_gzip.c>
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_include mime ^application/x-font-woff.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</IfModule>
##Gzip сжатие с помощью модуля mod_gzip - конец

 

##Кэширование с помощью модуля mod_headers - начало
<ifModule mod_headers.c>
#кэшировать html и htm файлы на один день
<FilesMatch "\.(html|htm)$">
Header set Cache-Control "max-age=43200"
</FilesMatch>
#кэшировать css, javascript и текстовые файлы на одну неделю
<FilesMatch "\.(js|css|txt)$">
Header set Cache-Control "max-age=604800"
</FilesMatch>
#кэшировать флэш и изображения на месяц
<FilesMatch "\.(flv|swf|ico|gif|jpg|jpeg|png)$">
Header set Cache-Control "max-age=2592000"
</FilesMatch>
#отключить кэширование
<FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi)$">
Header unset Cache-Control
</FilesMatch>
</IfModule>
##Кэширование с помощью модуля mod_headers - конец

 

##Кэширование с помощью модуля mod_expires - начало
<ifModule mod_expires.c>
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"
</ifModule>

 


Оставьте свой e-mail и мы вас бесплатно проконсультируем

Способы взаиморасчетов

+наличный и безналичный расчет

Хотите получить больше информации?

В любое время суток вы можете написать нам на почту или отправить адрес своей почты. Ежедневно с 10:00 до 18:00 вы можете позвонить нам. Мы всегда рады быть вам полезны!


Наши контакты

Директор: +7 (960) 591-11-19
Помощница Директора: +7 (960) 592-22-21
E-mail: info@quayside.ru

Связаться с нами

Back to top