Оптимальний htaccess для WordPress

Оптимальний htaccess для WordPress

Яким повинен бути оптимальний файл htaccess для WordPress?

Прописувати оптимальний файл htaccess доводиться у багатьох випадках. У кожного хостинга є свої особливості, тому важливо мати під рукою декілька варіантів і сміливо експериментувати без емоцій.

Оберіть з наведеного нижче необхідні налаштування і застосуйте на вашому сайті.

Знадобиться доступ до FTP, чи плагін для WordPress WP File Manager. Файл .htaccess знаходиться в корені сайту. Зрештою, дядько Гугль завжди підкаже 🙂

Файл .htaccess містить в собі налаштування для хостинг-серверів на базі linux. Багато хто не замислюється про важливість правильної конфігурації файлу .htaccess для сайту. Але ж від цього залежить безпека вашого сайту і багато інших аспектів його роботи.

Навіщо потрібен файл .htaccess?

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

1) Безпека:

  • Заборона лістингу директорій (відображення всіх розміщених в директорії файлів і папок).
  • Заборона різних SQL-ін’єкцій (спосіб злому сайту, заснований на впровадженні в запит довільного SQL-коду).
  • Блокування різних hacking tools (програм, скриптів для злому сайту).
  • Захист ключових конфігураційних файлів доступу (файлу wp-config.php, самого файлу .htaccess та інших).
  • Заборона прямого доступу до php, xml і ini файлів.

2) Оптимізація завантаження і продуктивності сайту:

  • Оптимальний mod_headers (установка Vary: Accept-Encoding).
  • Налаштування gzip-стиснення.
  • Налаштування кешування і періодів актуальності кеша (ExpiresByType).

3) Редиректи – перенаправлення:

  • Включення mod_rewrite і перенаправлень.
  • 301 редирект – перенаправлення з www.vash-sait.ua на vash-sait.ua або навпаки.
  • 302 – документ переміщений тимчасово.
  • 404 – файл не знайдений.
  • Інші редиректи, в тому числі складні.

Пам’ятайте: використовувати оптимальний .htaccess – принципово важливо для вашого сайту. Якщо ви не будете його використовувати – готуйтеся одного разу побачити сайт в чорних списках пошукових систем через злом, впровадження шкідливого коду і рекламних посилань, поширення спаму з вашого сайту і т.п.

Ставтеся серйозно до безпеки вашого сайту!

Конфігурація файлу htaccess для WordPress

Коротка довідка:

Загальні правила: все нові директиви налаштувань пишуться з нового рядка. Щоб закоментувати правило, поставте на початку рядка знак #
Важливо: закоментований рядок не працює і служить як примітка для вебмайстра.
Певні модулі параметрів слід укладати в секції, наприклад <IfModule mod_headers.c> і </IfModule>.

Отже, розглянемо які секції файлу htaccess за що відповідають.

1) Закриємо лістинг файлів і папок:

Options +FollowSymLinks -Indexes

2) Включим mod_rewrite:

RewriteEngine On

3) Тепер додамо блок налаштувань безпеки:

# Block out any script trying to base64_encode data within the URL.
RewriteCond %{QUERY_STRING} base64_encode[^(]*\([^)]*\) [OR]
# Block out any script that includes a <script> tag in URL.
RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]
# Block out any script trying to set a PHP GLOBALS variable via URL.
RewriteCond %{QUERY_STRING} GLOBALS (=|\[|\%[0-9A-Z]{0,2}) [OR]
# Block out any script trying to modify a _REQUEST variable via URL.
RewriteCond %{QUERY_STRING} _REQUEST (=|\[|\%[0-9A-Z]{0,2})
# Return 403 Forbidden header and show the content of the root homepage
RewriteRule .* index.php [F]
#
# Deny access to php, xml and ini files
# within components and plugins directories
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} \/xmlrpc\/
RewriteRule ^(.*)$ index.php [R=404,L]

# Prevent most common SQL-Injections
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]

# Block most common hacking tools
SetEnvIf user-agent «Indy Library» stayout=1
SetEnvIf user-agent «libwww-perl» stayout=1
SetEnvIf user-agent «Wget» stayout=1
deny from env=stayout

4) Зазначимо редиректи, якщо це необхідно:

RewriteRule .* — [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
#
# If the requested path and file is not /index.php and the request
# has not already been internally rewritten to the index.php script
RewriteCond %{REQUEST_URI} !^/index\.php
# and the request is for something within the component folder,
# or for the site root, or for an extensionless URL, or the
# requested URL ends with one of the listed extensions
RewriteCond %{REQUEST_URI} /component/|(/[^.]*|\.(php|html?|feed|pdf|vcf|raw))$ [NC]
# and the requested path and file doesn’t directly match a physical file
RewriteCond %{REQUEST_FILENAME} !-f
# and the requested path and file doesn’t directly match a physical folder
RewriteCond %{REQUEST_FILENAME} !-d
# internally rewrite the request to the index.php script
RewriteRule .* index.php [L]

5) Налаштуємо gzip-стиснення:

<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/javascript text/css application/x-javascript
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch bMSIE !no-gzip !gzip-only-text/html
<ifmodule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_item_include file \.js$
mod_gzip_item_include file \.css$ </ifmodule>
</IfModule>

6) Налаштуємо кешування і час актуальності кеша:

<IfModule mod_expires.c>
ExpiresActive On# Default expiration: 1 hour after request
ExpiresDefault «now plus 1 hour»# CSS and JS expiration: 1 week after request
ExpiresByType text/css «now plus 1 week»
ExpiresByType application/javascript «now plus 1 week»
ExpiresByType application/x-javascript «now plus 1 week»# Image files expiration: 1 month after request
ExpiresByType image/bmp «now plus 1 month»
ExpiresByType image/gif «now plus 1 month»
ExpiresByType image/jpeg «now plus 1 month»
ExpiresByType image/jp2 «now plus 1 month»
ExpiresByType image/pipeg «now plus 1 month»
ExpiresByType image/png «now plus 1 month»
ExpiresByType image/svg+xml «now plus 1 month»
ExpiresByType image/tiff «now plus 1 month»
ExpiresByType image/vnd.microsoft.icon «now plus 1 month»
ExpiresByType image/x-icon «now plus 1 month»
ExpiresByType image/ico «now plus 1 month»
ExpiresByType image/icon «now plus 1 month»
ExpiresByType text/ico «now plus 1 month»
ExpiresByType application/ico «now plus 1 month»
ExpiresByType image/vnd.wap.wbmp «now plus 1 month»
ExpiresByType application/vnd.wap.wbxml «now plus 1 month»
ExpiresByType application/smil «now plus 1 month»# Audio files expiration: 1 month after request
ExpiresByType audio/basic «now plus 1 month»
ExpiresByType audio/mid «now plus 1 month»
ExpiresByType audio/midi «now plus 1 month»
ExpiresByType audio/mpeg «now plus 1 month»
ExpiresByType audio/x-aiff «now plus 1 month»
ExpiresByType audio/x-mpegurl «now plus 1 month»
ExpiresByType audio/x-pn-realaudio «now plus 1 month»
ExpiresByType audio/x-wav «now plus 1 month»# Movie files expiration: 1 month after request
ExpiresByType application/x-shockwave-flash «now plus 1 month»
ExpiresByType x-world/x-vrml «now plus 1 month»
ExpiresByType video/x-msvideo «now plus 1 month»
ExpiresByType video/mpeg «now plus 1 month»
ExpiresByType video/mp4 «now plus 1 month»
ExpiresByType video/quicktime «now plus 1 month»
ExpiresByType video/x-la-asf «now plus 1 month»
ExpiresByType video/x-ms-asf «now plus 1 month»
</IfModule>

7) Налаштуємо параметри mod_headers (Vary: Accept-Encoding)

<IfModule mod_headers.c>
<FilesMatch «\.(js|css|xml|gz)$»>
Header append Vary: Accept-Encoding
</FilesMatch>
</IfModule>
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ — [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

8) Захищаємо від несанкціонованого доступу файл wp-config.php

<Files wp-config.php>
# Забороняємо всім доступ до файлу wp-config.php
order allow,deny
deny from all
</Files>

 

9) Захищаємо від доступу сам файл .htaccess

<Files .htaccess>
order allow,deny
deny from all
</Files>

10) Додамо правильний метод кодування за замовчуванням

AddDefaultCharset utf-8

11) Перенаправлення на домен без www

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.site.ua$ [NC]
RewriteRule ^(.*)$ http://site.ua/$1 [R=301,L]

Увага: замініть адресу site.ua на адресу вашого сайту!
12) Перенаправлення з домена без www на адресу з www:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^site\.ua
RewriteRule ^(.*)$ http://www.site.ua/$1 [R=permanent,L]

Увага: замініть адресу www.site.ua на адресу вашого сайту!

Все, ми вказали всі необхідні параметри у файлі htaccess для WordPress. Не забудьте зберегти файл після додавання коду.


—————————– ПУБЛІКАЦІЯ В ПРОЦЕСІ ЗАВЕРШЕННЯ ——————–

пишу на перекурах між адмініструванням і написанням декількох сайтів 😉