Керівництво по .htaccess і mod_rewrite

По темі:


Файл-конфигуратор Apache-серверов .htaccess


Короткий посібник з htaccess і mod_rewrite

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

Хочу запропонувати вам просте рішення замість пошуку більш складних для того, щоб зрозуміти як працюють mod_rewrite і htaccess. Більшість прикладів використання, наведені в цій статті можуть бути просто скопійовані і вивантажені на ваш веб-сервер.

Щоб не повторювати одне й те саме сотням інших веб-майстрів, я вирішив просто створити цю сторінку-підказку для загального користування.

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

Файл htaccess - це текстовий файл, який має назву .htaccess. Можна навіть сказати, що це файл, що складається тільки з розширення, тому що не містить іменний частини (до символу "точка"). Зазвичай цей файл розташований в основний кореневої директорії вашого сервера, але ви також можете створювати окремі файли htaccess для різних директорій на своєму сайті.

Канонізація

Сама найпростіший приклад - зробити так, щоб сайт не містив помилок канонізації для домашньої сторінки.

Безліч веб-майстрів страждають від не дуже хорошої ранжирування в пошукових системах через те, що існують кілька версій URL домашньої сторінки, наприклад:

  http://www.site.com 
http://site.com
http://www.site.com/index.html
http://site.com/index.html

Ці сторінки виглядають як різні URL, незважаючи на те, що вони вказують на один і той же зміст. Google в кінцевому підсумку вирішить, яка з версій більш правильна, але може пройти чимало часу, а ви за цей час можете поиметь зайві проблеми.

Щоб вирішити цю проблему, просто додайте наступні рядки в свій htaccess-файл:

  Options + FollowSymLinks 
RewriteEngine on
RewriteCond% {HTTP_HOST} ^ site.com
RewriteRule (. *) Http://www.site.com/$1 [R = 301, L]
RewriteCond% {THE_REQUEST} ^ [AZ] {3,9} \ / index \ .html \ HTTP /
RewriteRule ^ index \ .html $ http://www.site.com/ [R = 301, L]

Даний код дозволить перенаправляти всі можливі варіанти домашньої сторінки на http://www.site.com.

Перетворення файлів HTML в PHP

Іноді вам необхідно використовувати PHP-код на HTML-сторінках статичного сайту. Замість того, щоб перенаправляти всі свої HTML-сторінки на їх еквівалентні PHP-версії, вам просто необхідно "сказати" свого облікового запису, що він повинен довільні HTML-файли як PHP.

  AddHandler application / x-httpd-php .html 

Даний код працює з будь-якими файлами, тому, якщо ви захочете створити динамічні XML- або ASP-файли, які будуть вести себе як PHP-файли, вам просто потрібно внести наступні зміни:

  AddHandler application / x-httpd-php .xml 
AddHandler application / x-httpd-php .asp

сторінки помилок

Призначені для користувача сторінки помилок можуть бути легко налаштовані, наприклад в CPanel (або DirectAdmin), але, якщо ви захочете налаштувати сторінку помилки через htaccess-файл, додайте в нього наступний рядок:

  # Обробка ошікі 404 - Файл не знайдено 
ErrorDocument 404 http://www.site.com/404.php
# Обробка ошікі 403 - Доступ заборонений
ErrorDocument 403 http://www.site.com/403.php

Індексація директорій

Щоб заборонити роботу Google індексувати директорії ви повинні визначити індексну сторінку для необхідних директорій. Це не є обов'язковим на деяких серверах.

  DirectoryIndex index.php3 

Я вважаю за краще робити перенаправлення на індексну сторінку директорії або іншу підходящу сторінку. Наприклад, www.site.com/images/ може бути перенаправлений на www.site.com, а www.site.com/forum/ може бути перенаправлений на www.site.com/forum/index.php

Перенаправлення сторінки

Відмінний приклад використання htaccess для перенаправлення однієї сторінки на іншу:

  redirect 301 /old-page.php http://www.site.com/new-page.php 

Перенаправлення вашого фіда на Feedburner

Якщо ви хочете перемкнути ваш фід на сервіс Feedburner, вам необхідно буде перенаправити свій поточний фід на нову адресу http://feeds.feedburner.com/blog-feed.

Перенаправлення повинно застосовуватися для всіх відвідувачів крім робота Feedburner:

  RewriteCond% {HTTP_USER_AGENT}! FeedBurner 
RewriteRule ^ ваш-фід \ .xml $ http://feeds.feedburner.com/blog-feed [R, L]

Покращена хотлінк-захист

Якщо ви хочете заборонити іншим веб-сайтам безпосередньо посилатися на зображення, розташовані на вашому сайті, але дозволити пошуковим системам Google, Yahoo і MSN індексувати їх, вам необхідно скористатися наступним кодом:

  RewriteEngine on 
RewriteCond% {HTTP_REFERER}.
RewriteCond% {HTTP_REFERER}! ^ Http: // ([^.] + \.)? Site \. [NC]
RewriteCond% {HTTP_REFERER}! Google \. [NC]
RewriteCond% {HTTP_REFERER}! Search \? Q = cache [NC]
RewriteCond% {HTTP_REFERER}! Msn \. [NC]
RewriteCond% {HTTP_REFERER}! Yahoo \. [NC]
RewriteCond% {REQUEST_URI}! ^ / Hotlinker \ .gif $
RewriteRule \. (Gif | jpg | png) $ /hotlinker.gif [NC, L]

Зображення hotlinker.gif - це зображення, яке створено вами. Я пропоную використовувати щось типу "Це зображення знаходиться на сайті www.site.com" і ваш логотип.

Особисто я дозволяю хотлінк, але використовую певне рішення, яке використовує сервіс Google Images і сайти-хотлінкери для отримання посилань на свій сайт .

Створення ЧПУ посилань з допомогою mod_rewrite

Модуль перезапису Apache в основному використовується для перетворення динамічних URL виду www.site.com/product.php?id=123 в статичні і дружні користувачеві виду www.site.com/product/123.

  RewriteEngine on 
RewriteRule ^ product /([^/\.]+)/?$ product.php? Id = $ 1 [L]

Ще один приклад, який наводить URL: www.yoursite.com/script.php?product=123 до виду www.yoursite.com/cat/product/123/

  RewriteRule cat /(.*)/(.*)/$ /script.php?$1=$2 

Видалення рядків запитів

Деякі сайти посилаються на ваш, додаючи рядок запиту. Наприклад, можна послатися на ваш сайт, використовуючи це посилання http://www.site.com/index.php?source=seoblog, просто для того, щоб знати звідки приходить трафік. Це стає причиною появи дублюючого змісту для вашого сайту, тому вам потрібно налаштувати перенаправлення на вашу домашню сторінку:

  RewriteCond% {QUERY_STRING} ^ source = RewriteRule (. *) / $ 1?  [R = 301, L] 

Поки все. Якщо є, що додати, прошу в каменти ...

На більшості хостингів встановлено дві і більше версій PHP. Зазвичай за замовчуванням коштує 4-я. Однак, для того, що б ваші PHP скрипти оброблялися в 5-й версії, ви можете прописати в htaccess:

  AddType application / x-httpd-php5 .php 

Або можете додавати до кожного файлу розширення .php5 замість просто .php.
Це на випадок якщо вам лінь редіктіровать htaccess.






Приклади налаштування файлу .htaccess

Поки деякі наші доблесні сео "гуру" переводять іноземні статті, не обтяжуючи себе установкою посилання на оригінал статті, наведу вам підбірку кодів для настройки .htaccess.

Майже всі пункти є обов'язковими, крім

  • редиректу і блокування - вони налаштовуються по мірі необхідності
  • а також налаштування ЧПУ (ЧеловекоПонятнихУРЛ) - як правило, можна обійтися функціоналом CMS

Як створити .htaccess?

  1. відкриваємо блокнот
  2. пишемо код (можна і потім це зробити :)
  3. зберігаємо документ з назвою .htaccess
  4. заливаємо в корінь сайту (або в папку на сервері, де будемо проводити налаштування)

* Yoursitename.ru в прикладах замінюйте на адресу вашого домену

Налаштування htaccess за замовчуванням

Налаштування htaccess за замовчуванням

1. Установка головної сторінки за замовчуванням

  DirectoryIndex pagename.html 

2. Визначення сторінок помилок (error) в .htaccess

  ErrorDocument 403 /403.php 
ErrorDocument 404 /404.php
ErrorDocument 500 /500.php
Відповідно адреса і назва файлу можуть бути іншими, наприклад /error/page404.html

3. Захист від хотлінк
Те, що контент з сайтів крадуть, це вже давно не новина. Але буває, що прут разом з картинками. Ось щоб уникнути навантаження на сервер і роздуття трафіку, пишемо:

  RewriteEngine On 
RewriteCond% {HTTP_REFERER}! ^ $

# Домени, які можуть посилатися на картинки з вашого сайту
RewriteCond% {HTTP_REFERER}! ^ Http: // ([-a-z0-9] \.)? Yoursitename \ .ru [NC]

# Більше не показувати картинки при хотлінк
RewriteRule \. (Gif | jpe? G | png) $ - [F, NC, L]
Якщо хочете, щоб на чужому сайті замість 403 помилки з'являлася певна картинка, останній рядок слід замінити на:
  RewriteRule \. (Jpg | png | gif) $ http://yoursitename.ru/images/imagename.jpg [NC, R, L] 

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

  AddType application / octet-stream .doc .mov .avi .pdf .xls .mp4 

5. Кешування файлів
У WordPress для цього є спеціальний плагін: wp-super-cache. Якщо ви ж користуєтесь CMS, яка кешування не підтримує, то можна зробити наступні настройки в .htaccess

  # Кешування html і htm на добу 
<FilesMatch ". (Html ​​| htm) $">

Header set Cache-Control "max-age = 43200"
</ FilesMatch>

# Кешування css, javascript і txt-файлів на тиждень
<FilesMatch ". (Js | css | txt) $">

Header set Cache-Control "max-age = 604800"
</ FilesMatch>

# Кешування flash і картинок на місяць
<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>
Параметр max-age наведено в секундах.

6. Включення помилок на час налагодження

  php_flag display_errors on 

Налаштування редиректу за допомогою .htaccess

Налаштування редиректу за допомогою .htaccess

1. 301 редирект
Оптимальне рішення для перенаправлення відвідувачів зі старих адрес на нові, якщо з часом структура сайту змінювалася, а старі URL'и могли десь залишитися.

  Redirect 301 /oldpage.html http://yoursitename.ru/newpage.html 

Зустрічається ще такий варіант:
  Redirect permanent /oldpage.html http://yoursitename.ru/newpage.html 
Але в чому принципова різниця між ними, чесно кажучи, пояснити не зможу. Може хто з читачів підкаже.

2. Склеювання доменів з www і без www
Редирект з адреси yoursitename.ru на www.yoursitename.ru

  RewriteEngine On 
RewriteBase /
RewriteCond% {HTTP_HOST}! ^ Www.yoursitename.ru $ [NC]
RewriteRule ^ (. *) $ Http://www.yoursitename.ru/$1 [L, R = 301]
зворотний редирект
  RewriteEngine On 
RewriteBase /
RewriteCond% {HTTP_HOST}! ^ Yoursitename.ru $ [NC]
RewriteRule ^ (. *) $ Http://yoursitename.ru/$1 [L, R = 301]

3. 302 редирект
Якщо ви ведете роботи на сайті, то можете тимчасово відправляти відвідувачів на потрібну сторінку (наприклад, з опис того, коли планується завершення робіт і як можна з вами зв'язатися).

  RewriteEngine on 
RewriteCond% {REQUEST_URI}! /informpage.html$
RewriteCond% {REMOTE_HOST}! ^ 12 \ .345 \ .678 \ .90
RewriteRule $ http://yoursitename.ru/informpage.html [R = 302, L]
Перегляд сайту буде можливий тільки з вашого ip-адреси - 12.345.678.90

4. Переведення на інший сайт
Переадресація всіх відвідувачів на інший сайт, крім зазначених ip-адрес

  ErrorDocument 403 http://www.yoursitename.ru 
Order deny, allow
Deny from all
Allow from 12.345.678.90
Allow from 12.345.678.92

5. Переведення на безпечне https з'єднання

  RewriteEngine On 
RewriteCond% {HTTPS}! On
RewriteRule (. *) Https: //% {HTTP_HOST}% {REQUEST_URI}

Заборона / блокування за допомогою .htaccess

Заборона / блокування за допомогою .htaccess

1. Заборона на лістинг директорії
Використовується при відсутності індексного файлу, якщо хочете заборонити перегляд вмісту папки (наприклад, для images):

  Options All -Indexes 
Зворотний код, в сенсі дозвіл
  Options + Indexes 

2. Блокування доступу до файлу
Наприклад, це може бути ваш .htaccess

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

3. Блокування доступу до директорії
Закрити доступ тільки до певної папки

  <Directory / root-access /> 
Order allow, deny
# Всім, крім ...
allow from all
Deny from 198.69.
</ Directory>
Дозвіл доступу тільки з певних IP до певної папки (адреси записуються через пробіл):
  # Вказуємо папку, до якої забороняємо доступ на ім'я хоста і його IP 
<Directory / root-access />
Order deny, allow
deny from all
# Адреси записуються через пробіл
Allow from 198.69.144.98 198.69.144.94 198.69.144.92
</ Directory>
Також є можливість вказувати в одному списку і хост-ім'я і IP-адреса:
  # Вказуємо папку, до якої забороняємо доступ на ім'я і IP 
<Directory / root-access />
Order allow, deny
# Всім, ...
allow from all
# ... Крім ім'я хоста і його IP
Deny from robot.fromx.com 148.145.21.14
</ Directory>

4. Блокування по ip
Щоб спамери не набридає

  <Limit GET> 
Order Deny, Allow
Deny from 12.345.678.90
Deny from 90.876.543.
Deny from .tvoe.tv
Allow from all
</ Limit>
Будуть заблоковані:
  • юзер з ip 12.345.678.90
  • всі відвідувачі з ip, що потрапляють в діапазон від 90.876.543.0 до 90.876.543.255
  • і всі відвідувачі від провайдера tvoe.tv
Для заборони доступу до папки сайту використовуються директиви allow і deny.
Заборонити доступ з певного IP-адреси
  # Заборона з 16:18 31-03-2011 
Order allow, deny
allow from all
Deny from 198.69.132.24
Закрити доступ ВСІМ, крім певних IP
  Order deny, allow 
deny from all
# Список IP через пробіл, з яких доступ дозволений
Allow from 194.111.70.48 194.78.47.128
У разі, якщо необхідно закрити доступ по масці то використовуємо неповна адреса:
  # Неповна адреса 
198.69.
# Повні адреси, що відповідають першому
198.69.132.24
198.69.136.89
198.69.1.8
Закрити доступ по масці:
  # Заборона з 6:18 31-03-2011 
Order allow, deny
allow from all
Deny from 198.69.

Налаштування ЧПУ за допомогою .htaccess

Взагалі, якщо ви працюєте з WordPress, то налаштувати "доброзичливі" url можна в розділі Настройки »Постійні посилання (ЧПУ). Багато CMS так само підтримують настройку адреси сторінки. Тому, якщо є можливість, спочатку спробуйте обійтися функціоналом движка, і потім вже починайте налаштування htaccess.

Налаштування ЧПУ за допомогою .htaccess

1. Як прибрати з адреси? P =
За замовчуванням адреса сторінки виглядає наступним чином: yoursitename.ru/?p=xxxx, де xxxx - id статті.

  RewriteCond% {REQUEST_URI} ^ / ([0-9] +) $ 
RewriteRule. * Http://yoursitename.ru/?p=%1 [R = 301, L]

2. Як прибрати з адреси category
За аналогією з минулим способом пишемо

  RewriteRule ^ category /(.+)$ http://yoursitename.ru/$1 [R = 301, L]