Налаштування сайту за допомогою .htaccess
19.11.2011, 11:12 | Прочитано: 10091 раз | Налаштування сайту | Автор: Денис Носов Друк | E-mail
У цій статті піде ми розглянемо більш краще налаштування сайту за допомогою .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
Деякі із цих правил я використовую на робочих сайтах. Так само багато із них використано і для нашого порталу.