Joomla! Україна

Налаштування сайту за допомогою .htaccess

19.11.2011, 11:12  |  Прочитано: 9908 раз  |  Налаштування сайту  |  Автор: Денис Носов

У цій статті піде ми розглянемо більш краще налаштування сайту за допомогою .htaccess: пришвидшення сайту, його безпека, правила кешування, стиснення даних (gzip!) і підготовка сайту до роботи з HTML5 відео та @font-face. Дана стаття базується на рекомендаціях HTML5 Boilerplate.

Зауважте, що деякі правила можуть призвести до створення 500 помилки, тому будь-те уважні в налаштуваннях правил, адже ці правила залежать від налаштувань встановлених вашим хостинг-провайдером!

Скасування режиму сумісності з IE7

Скасовуємо режим сумісності з IE7 і якщо встановлено ChromeFrame використовуємо його для рендерингу сторінок.

<IfModule mod_headers.c>
    Header set X-UA-Compatible "IE=Edge,chrome=1"
    # mod_headers can't match by content-type, but we don't want to send this header on *everything*...
    <FilesMatch "\.(js|css|gif|png|jpe?g|pdf|xml|oga|ogg|m4a|ogv|mp4|m4v|webm|svg|svgz|eot|ttf|otf|woff|ico|webp|appcache|manifest|htc|crx|xpi|safariextz|vcf)$" >
      Header unset X-UA-Compatible
    </FilesMatch>
</IfModule>

Крос-доменні Ajax запити

Для використання запитів на Ajax між доменами можна застосувати наступне правило:

<IfModule mod_headers.c>
  Header set Access-Control-Allow-Origin "*"
</IfModule>

Захист веб-шрифтів від використання на інших сайтах

Наступне правило дозволяє використовувати веб-шрифти тільки з вашого домену або піддомену.

<FilesMatch "\.(ttf|ttc|otf|eot|woff|font.css)$">
  <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
  </IfModule>
</FilesMatch>

Виставляємо правильні та коректні MIME-типи для всіх файлів

# JavaScript
AddType application/javascript         js

# Audio
AddType audio/ogg                      oga ogg
AddType audio/mp4                      m4a

# Video
AddType video/ogg                      ogv
AddType video/mp4                      mp4 m4v
AddType video/webm                     webm

# SVG.
AddType     image/svg+xml              svg svgz
AddEncoding gzip                       svgz
                                       
# Webfonts                             
AddType application/vnd.ms-fontobject  eot
AddType application/x-font-ttf    ttf ttc
AddType font/opentype                  otf
AddType application/x-font-woff        woff

# Assorted types
AddType image/x-icon                   ico
AddType image/webp                     webp
AddType text/cache-manifest            appcache manifest
AddType text/x-component               htc
AddType application/x-chrome-extension crx
AddType application/x-xpinstall        xpi
AddType application/octet-stream       safariextz
AddType text/x-vcard                   vcf

Стиснення даних за допомогою Gzip

<IfModule mod_deflate.c>

  # Force deflate for mangled headers developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping/
  <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>

  # HTML, TXT, CSS, JavaScript, JSON, XML, HTC:
  <IfModule filter_module>
    FilterDeclare   COMPRESS
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/html
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/css
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/plain
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/xml
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/x-component
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/javascript
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/json
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/xml
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/xhtml+xml
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/rss+xml
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/atom+xml
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/vnd.ms-fontobject
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $image/svg+xml
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/x-font-ttf
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $font/opentype
    FilterChain     COMPRESS
    FilterProtocol  COMPRESS  DEFLATE change=yes;byteranges=no
  </IfModule>

  <IfModule !mod_filter.c>
    # Legacy versions of Apache
    AddOutputFilterByType DEFLATE text/html text/plain text/css application/json
    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE text/xml application/xml text/x-component
    AddOutputFilterByType DEFLATE application/xhtml+xml application/rss+xml application/atom+xml
    AddOutputFilterByType DEFLATE image/svg+xml application/vnd.ms-fontobject application/x-font-ttf font/opentype
  </IfModule>
</IfModule>

Встановлення часу кешування для різних розширень файлів

<IfModule mod_expires.c>
  ExpiresActive on

# Perhaps better to whitelist expires rules? Perhaps.
  ExpiresDefault                          "access plus 1 month"

# cache.appcache needs re-requests in FF 3.6 (thanks Remy ~Introducing HTML5)
  ExpiresByType text/cache-manifest       "access plus 0 seconds"

# Документ html
  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 hour"
  ExpiresByType application/atom+xml      "access plus 1 hour"

# Favicon
  ExpiresByType image/x-icon              "access plus 1 week"

# Медіа: зображення, відео, аудіо
  ExpiresByType image/gif                 "access plus 1 month"
  ExpiresByType image/png                 "access plus 1 month"
  ExpiresByType image/jpg                 "access plus 1 month"
  ExpiresByType image/jpeg                "access plus 1 month"
  ExpiresByType video/ogg                 "access plus 1 month"
  ExpiresByType audio/ogg                 "access plus 1 month"
  ExpiresByType video/mp4                 "access plus 1 month"
  ExpiresByType video/webm                "access plus 1 month"
 
# HTC files  (css3pie)
  ExpiresByType text/x-component          "access plus 1 month"
 
# Веб-шрифти
  ExpiresByType font/truetype             "access plus 1 month"
  ExpiresByType font/opentype             "access plus 1 month"
  ExpiresByType application/x-font-woff   "access plus 1 month"
  ExpiresByType image/svg+xml             "access plus 1 month"
  ExpiresByType application/vnd.ms-fontobject "access plus 1 month"

# CSS і JavaScript
  ExpiresByType text/css                  "access plus 1 year"
  ExpiresByType application/javascript    "access plus 1 year"

  <IfModule mod_headers.c>
    Header append Cache-Control "public"
  </IfModule>

</IfModule>

Встановлення тегу ETag

Зауважте, що не на кожному сервері є підтримка ETag!

Оскільки для статичного змісту нам непотрібний ETag, то ми його відключаємо.

<IfModule mod_headers.c>
  Header unset ETag
</IfModule>

FileETag None

Налаштування куків для фреймів

Дане правило поширюється тільки для браузера IE. При необхідності вкажіть шлях до файлу p3p.xml. У прикладі шлях встановлено як: /w3c/p3p.xml

<IfModule mod_headers.c>
  <Location />
    Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""
  </Location>
</IfModule>

Позбавляємося «www.» на початку адреси в домені

Для коректної роботи переадресації це правило необхідно поставити відразу після
RewriteEngine On

<IfModule mod_rewrite.c>
  RewriteCond %{HTTPS} !=on
  RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
  RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
</IfModule>

Запобігання попереджень для сертифікату SSL

Використовуйте дане правило тільки якщо у Вас включений сертифікат SSL

<IfModule mod_rewrite.c>
  RewriteCond %{SERVER_PORT} !^443
  RewriteRule ^ https://example-domain-please-change-me.com%{REQUEST_URI} [R=301,L]
</IfModule>

Кодування UTF-8

Іноді сервер налаштований за замовчуванням на інше кодування. У такому випадку необхідно для сайту задати кодування UTF-8.

Зауважте, що Joomla використовує саме кодування UTF-8!

AddDefaultCharset utf-8
AddCharset utf-8 *
<IfModule mod_charset.c>
    CharsetSourceEnc utf-8
    CharsetDefault utf-8
</IfModule>

Щоб задати кодування для певних форматів файлів використовуємо наступне правило:

AddDefaultCharset utf-8
AddCharset utf-8 .html .css .js .xml .json .rss .atom
<IfModule mod_charset.c>
    CharsetSourceEnc utf-8
    CharsetDefault utf-8
</IfModule>

Деяки прийоми безпеки для сайту

Забороняємо перегляд папок без документів:

Options -Indexes

Блокуємо доступ до перегляду «прихованих» директорій які починаються з крапки:

<IfModule mod_rewrite.c>
  RewriteRule "(^|/)\." - [F]
</IfModule>

Збільшення безпеки з використанням PHP директив

Зверніть увагу, що якщо Ваш сервер не налаштований на підтримку PHO деректив, то Ви отримаєте помилку 500.

Якщо сервер не підтримує PHP дерективи, то у цьому випадку Ви можете звернутися до Вашого хостинг-провайдера за більш детальною інформацією.

Відключення register_globals

php_flag register_globals Off

Помилки на сайті

Реєструємо усі помилки:

php_value error_reporting -1

Записувати помилку у файл журналу (log-файл):

php_flag log_errors On

Відображати помилки у браузері. Відключаємо:

php_flag display_errors Off

Якщо необхідно для тестування сайту, то включамо наступним чином:

php_flag display_errors On

Не показувати помилки запуску:

php_flag display_startup_errors Off

Розмір файлу помилок:

php_value log_errors_max_len 1024

Підвищення безпеки кукі

<IfModule php5_module>
    php_value session.cookie_httponly true
</IfModule>

Відключаємо повідомлення про те, що сайт працює на Apache

ServerSignature Off

Деякі із цих правил я використовую на робочих сайтах. Так само багато із них використано і для нашого порталу.