This page has been robot translated, sorry for typos if any. Original content here.

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

По темі:


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


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

Mod_rewrite - модуль, який використовується веб-серверами для перетворення URL'ов.

Директиви модуля Mod_rewrite

  • RewriteBase
  • RewriteCond
  • RewriteEngine
  • RewriteLock
  • RewriteLog
  • RewriteLogLevel
  • RewriteMap
  • RewriteOptions
  • RewriteRule

Варіанти реалізації редирект за допомогою файлу .htaccess

  1. Простий редирект:
      Redirect 301 / http://www.domainname.ru/
    
    або
      redirect / secret http://www.site.ru/nosecret
    
    Ставиться у файлі .htaccess або httpd.conf для Apache. Перший "/" означає, що все з верхнього рівня сайту, включаючи всі підкаталоги, буде переадресовано (не забудьте поставити останній "/"). Якщо Ви хочете переадресувати тільки сторінку, зберігши PR старої сторінки, можна зробити так:

    Redirect 301 /old/old.htm http://www.you.ru/new.htm де:
    /old/old.htm - шлях і ім'я старої сторінки
    http://www.you.com/new.htm - новий шлях і нове ім'я переміщеної сторінки

  2. Редирект на будь-яку сторінку з ip користувача або при запиті конкретної сторінки (а також по масці імені).
    Якщо у користувача ip 192.152.37.125, то він буде перенаправлений на сторінку user.php:
      SetEnvIf REMOTE_ADDR 192.152.37.125 REDIR = "redir"
     RewriteCond% {REDIR} redir
     RewriteRule ^ / $ /user.php
    
  3. Редирект при запиті певних файлів. Якщо запитуються файли, розширення яких не вказано в файлі .htaccess (gif та jpg), то слід перенаправлення:
      RewriteEngine On
     RewriteRule!. (Gif | jpg) $ index.php
    

  4. Використання mod_rewrite:
      Options + FollowSymLinks 
     RewriteEngine on 
     RewriteCond% {HTTP_HOST} ^ yourdomain \ .ru 
     RewriteRule ^ (. *) $ Http://www.yourdomain.ru/$1 [R = permanent, L]
    

  5. Редирект з регулярним виразом:
      RedirectMatch 301 (. *) Http: //www.yourdomain.ru$1 Прописується в файлі .htaccess. 
    
    (. *) RedirectMatch фактично відповідає регулярним зразкам вираження після доменного імені. Таким чином, не можна виконати відповідність зразка на ^ / yourdomain.ru. Однак, можна перетворити сторінки з використанням .html розширення до файлів того ж самої назви, але з .php розширенням:
      RedirectMatch 301 (. *) \. Html $ http: //www.yourdomain.ru$1.php
    
    Якщо необхідно зробити різне перенаправлення для окремих сторінок, можна використовувати наступне:
      RedirectMatch Permanent ^ / html / resources.html $ http://www.newdomain.com/resources.php 
     RedirectMatch Permanent ^ / html / other_page.html $ http://www.newdomain.com/other_page.php 
     RedirectMatch Permanent ^ / (. *) $ Http://www.newdomain.com/ 
    
    "RedirectMatch Permanent" - це еквівалент "RedirectMatch 301", рядок з "* (Wildcard)" повинна бути останньою в цьому списку.

  6. Створення зручний читаються URL
    Щоб перетворити, наприклад, www.site.ru/product.php?id=123 в www.site.ru/product/123 наступним чином:
      RewriteEngine on
     RewriteRule ^ product /([^/\.]+)/?$ product.php? Id = $ 1 [L]
    
    У наступному прикладі перетворимо www.site.ru/script.php?product=123 в www.site.ru/cat/product/123/:
      RewriteRule cat /(.*)/(.*)/$ /script.php?$1=$2
    

  7. Редирект на PHP:
      header ( "HTTP / 1.1 301 Moved Permanently"); 
     header ( "Location: http://www.newdomain.ru/newdir/newpage.htm"); 
     exit (); 
    
    Природно, треба створити сторінку, при зверненні до якої і буде відбуватися Редірект, і розмістити її на сервері. І краще вкажіть HTTP / 1.1 (а не HTTP / 1.0 або HTTP / 0.9, які не підтримують віртуальний хостинг)

  8. Редирект всіх файлів в папці на один файл.
    Наприклад ви більше не потребуєте в розділі сайту Super discount і хочете перенаправити всі запити до папки / superdiscount на один файл /hot-offers.php. Для цього додаємо в .htaccess наступний код.
      RewriteRule ^ superdiscount (. *) $ /hot-offers.php [L, R = 301]
    

  9. Редирект всієї папки крім одного файлу
    У наступному прикладі всі файли з папки / superdiscount будуть редирект на на файл /hot-offers.php, КРІМ файлу /superdiscount/my-ebook.html кото повинен редирект на /hot-to-make-million.html
      RewriteRule ^ superdiscount / my-ebook.html /hot-to-make-million.html [L, R = 301]
     RewriteRule ^ superdiscount (. *) $ /hot-offers.php [L, R = 301]
    

  10. Редирект динамічного URL на новий файл.
    Даний варіант стане в нагоді якщо ви хочете редирект динамічний URL з параметрами на новий статичний файл.
      RewriteRule ^ article.jsp? Id = (. *) $ /latestnews.htm [L, R = 301]
    
    Тобто тепер, запит до файлу виду http://www.kass.ws/article.jsp?id=8632 і / або http://www.kass.ws/article.jsp?id=1245 буде відправлений на файл http : //www.kass.ws/latestnews.htm.

  11. Масовий редирект нових файлів.
    Тепепь перейдемо до найскладнішого моменту, коли вам треба редирект масу URL-ів, наприклад після зміни вашої CMS. Тут відразу виникає ряд проблем. По-перше, внесення всіх змінених адрес в .htaccess файл займе дуже багато часу, та й саме по собі заняття малоприємне. По-друге, занадто багато записів в .htaccess файлі будуть гальмувати Apache сервера. І по-третє, при внесенні такої кількості інформації висока ймовірність, що ви десь помилитеся. З цього, найкращий вихід, це найняти програміста який вам напише динамічний редирект.
    Наведений нижче приклад написаний на PHP, але так само може бути виконаний на будь-якій мові. Припустимо ви перейшли на нову систему посилань на вашому сайті і всі файли що закінчуються на старий id повинні бути средірекчени. Спочатку створюємо в базі таблицю, яка містить старий id і новий URL для перенаправлення. old_id INT new_url VARCHAR (255) Далі пишемо код який зв'яже ваші старі id з новими URL-ами
    Після цього, додаємо наступний рядок в .htaccess:
     RewriteRule ^ / product - (. *) _ ([0-9] +). Php /redirectold.php?productid=$2 
    потім створюємо PHP файл redirectold.php, який буде підтримувати 301 редирект:
      <? Php
     function getRedirectUrl ($ productid) {
     // Connect to the database
     $ DServer = "localhost";
     $ DDb = "mydbname";
     $ DUser = "mydb_user";
     $ DPass = "password";
    
     $ S = @mysql_connect ($ dServer, $ dUser, $ dPass)
     or die ( "Could not connect to database server");
    
     @mysql_select_db ($ dDb, $ s)
     or die ( "Could not connect to database");
    
     $ Query = "SELECT new_url FROM redirects WHERE old_id =".  $ Productid;
     mysql_query ($ query);
     $ Result = mysql_query ($ query);
     $ HasRecords = mysql_num_rows ($ result) == 0?  false: true;
     if (! $ hasRecords) {
     $ Ret = 'http://www.yoursite.com/';
     } Else {
     while ($ row = mysql_fetch_array ($ result))
     {
     $ Ret = 'http://www.yoursite.com/'.  $ Row [ "new_url"];
     }
     }
     mysql_close ($ s);
     return $ ret;
     }
    
     $ Productid = $ _GET [ "productid"];
     $ Url = getRedirectUrl ($ productid);
    
     header ( "HTTP / 1.1 301 Moved Permanently");
     header ( "Location: $ url");
     exit ();
     ?>
    

    Тепер всі запити до ваших старих URL-ам викликатимуть redirectold.php, який знайде новий URL і поверне 301 відповідь з вашої нової посиланням.

    Редіректи в залежності від часу

    Коли потрібно застосовувати прийоми типу змісту залежить від часу маса вебмайстрів все ще використовують CGI скрипти які виробляють редіректи на спеціальні сторінки. Як це може бути зроблено через mod_rewrite?

    Є багато змінних названих TIME_xxx для умов редиректу. У зв'язці зі спеціальними лексикографічними зразками для порівняння STRING і = STRING ми можемо виробляти редіректи залежать від часу:
     
      RewriteEngine on RewriteCond% {TIME_HOUR}% {TIME_MIN}> 0700 RewriteCond% {TIME_HOUR}% {TIME_MIN} <1900 RewriteRule ^ foo \ .html $ foo.day.html RewriteRule ^ foo \ .html $ foo.night.html 

    Це видає вміст foo.day.html при запиті URL foo.html з 07:00 до 19:00 а в час, що залишився вміст foo.night.html.


  12. Прибираємо у всіх запитів спочатку "WWW."
     RewriteEngine on # оголошуємо, що хочемо використовувати mod_rewrite
     RewriteCond% {HTTP_HOST} ^ www \. (. *) [NC]
     RewriteRule ^ /? (. *) Http: //% 1 / $ 1 [L, R = permanent]
    

  13. Міняємо розширення .html на .php
    Іноді буває так, що у Вас статичний веб-сайт, а Вам необхідно, щоб на ньому спрацьовував якийсь php-скрипт. Для цього Вам необхідно сказати сервера, щоб він обробляв цю сторінку як php-файл.
     AddHandler application / x-httpd-php .html
    
    Цей прийом можна використовувати і для інших розширень файлів:
     AddHandler application / x-httpd-php .xml
     AddHandler application / x-httpd-php .asp
    

Заборона доступу в конкретну директорію

  1. для всіх до всіх файлів в директорії:
      deny from all
    
  2. до конкретного файлу:
     deny from all
    
  3. по ip користувача:
      order deny, allow
     deny from all
     allow from 192.152.37.125
    
    Доступ в цю директорію буде дозволений тільки користувачеві з ip 192.152.37.125.

    А якщо хочете навпаки, заборонити окремим ip користувачам доступ до вашого сайту, то пропишемо такі рядки:

     order allow, deny
     allow from all
     deny from 192.152.37.125
     deny from 123.456.177
    
  4. Директива Options -Indexes - заборона на відображення вмісту каталогу при відсутності індексного файлу Іноді потрібно зробити так, щоб в разі відсутності в каталозі файлу, який показується за замовчуванням, не видавався список файлів в каталозі. Тоді можна додати в .htaccess такий рядок:
      Options -Indexes
    
    У цьому випадку замість списку файлів в каталозі відвідувач отримає HTTP помилку 403 - access forbidden.
  5. Заборонити доступу до файлів з декількома типу розширень
     deny from all
    
    Заборонено доступ до файлів з розширенням * .inc, * .conf і * .cfg. Хоча директива, за замовчуванням, не працює з регулярними виразами, але їх можна включити поставивши символ тильди (~) в опціях директиви. Синтаксис наступний: [тильда] [пробіл] [далее_все_без_пробелов] Щоб блокувати цей доступ, запишемо наступне:
      RewriteRule ^ .htaccess $ - [F]
    
    Це правило перекладається так:
    Якщо хтось пробує звертатися до файлу .htaccess, система повинна зробити код помилки 'HTTP response of 403' або '403 Forbidden - You do not have permission to access /.htaccess on this server'.

    Конструкція ^ .htaccess $ в цьому регулярному виразі означає:
    ^ - якір початку рядка
    $ - якір кінця рядка
    . - в регулярних виразах точка '.' позначає мета-символ і повинна бути захищена зворотним слешем (backslash), якщо Ви все-таки хочете використовувати саме фактичну точку.

    Назва файлу повинна бути розташована точно між початковим і кінцевим якорем. Це гарантуватиме те, що тільки це певне ім'я файлу і ніяке інше, згенерує код помилки.
    [F] - спеціальний 'забороняє' прапорець (forbidden).
    [NC] - не враховувати регістр букв.
    [OR] - означає 'або така умова'.

визначення кодування

Визначення кодування, в якій сервер "віддає" файли

  AddDefaultCharset windows-1251
варіанти: KOI8-R, UTF-8, Windows-1251

Визначення кодування на завантаження

  CharsetSourceEnc windows-1251

Установка пароля на директорію за допомогою .htaccess

Для установки пароля на директорію можна скористатися системою базової авторизації, передбаченої в веб-сервері Apache. Створюємо в каталозі, до якого хочемо обмежити доступ по паролю, файл .htaccess з такими директивами:
  AuthType Basic
 AuthName "Some Name"
 AuthUserFile /www/some_login/www/htdocs/some_dir/.htpasswd
 require valid-user
Шлях /www/some_login/www/htdocs/some_dir/.htpasswd позначає повний шлях до файлу паролів на диску нашого сервера. Якщо, наприклад, ви помістіть файл .htpasswd (в ньому будуть паролі) в домашній каталог, куди ви потрапляєте, зайшовши на сервер по FTP, то шлях до цього файлу буде мати вигляд /www/some_login/www/htdocs/some_dir/.htpasswd , де some_login - Ваш логін. У директиві AuthUserFile вказуємо абсолютний шлях до файлу з логінами / паролями, який ми створимо трохи пізніше. Якщо ви створюєте файл .htaccess на своєму комп'ютері, а не відразу на сервері використовуючи текстовий редактор, зверніть особливу увагу на те, що .htaccess повинен передаватися по FTP строго в текстовому (ASCII) режимі.

Створюємо файл паролів. Файл з паролями повинен містити такі рядки login: password. Пароль повинен бути зашифрований з використанням алгоритму MD5. Один із способів створити такий файл - скористатися програмою, яка входить в поставку Apache - htpasswd (на нашому сервері вона знаходиться в каталозі / usr / local / apache / bin, повний шлях - / usr / local / apache / bin / htpasswd).

Розглянемо, як створити файл паролів в unix shell прямо на сервері. Зайдемо в shell і будемо виконувати наступні команди:

  htpasswd -mbc .htpasswd user1 7B1safkir
- створюємо новий файл .htpasswd, в який додаємо запис для користувача user1 з паролем, зазначеним у командному рядку.
  htpasswd .htpasswd user2
- додаємо в уже існуючий файл .htpasswd користувача user2, а пароль вводимо вручну у відповідь на відповідний запит програми.

Після закінчення закладу всіх логінів файл потрібно завантажити на сервер. Про інших способах установки паролів на сторінку

Задаємо власні сторінки помилок

Задати власну сторінку помилок можна наступним чином:
  ErrorDocument 404 http://www.site.ru/404.php
IE ігнорує сторінки розміром менше 512 байт.

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

Щоб уникнути індексації пошуковими системами директорій і піддиректорій, необхідно прописати такий рядок, наприклад:
  DirectoryIndex index.php
Ця директива задає файл, який буде викликаний при зверненні до директорії без вказівки імені файлу.

Можна вказати кілька індексних сторінок. При запиті каталогу вони будуть шукатися в тому порядку, в якому перераховані в директиві DirectoryIndex. Якщо не буде знайдений файл index.html, то буде проведений пошук файлу index.php і т.д.

  DirectoryIndex index.html index.php index.shtml

Особисто я віддаю перевагу переадресовувати з порожніх директорій або на головну сторінку сайту, або на будь-яку іншу відповідну сторінку. Наприклад, директорію www.site.ru/pic/ можна переадресувати на www.site.ru.

Захист зображень від скачування

Дуже часто буває, що веб-майстри нахабно копіюють контент з вашого сайту разом з малюнками, причому малюнки завантажуються з вашого ж сервера. Це створює зайвий трафік, що, найчастіше, приводить до ряду проблем. Як же захиститися від таких веб-майстрів і не перешкодити пошуковим роботам індексувати зображення? Все просто:
  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 - зображення, яке буде відображатися, замість справжніх зображень. Рекомендую в цьому зображенні відобразити Ваш логотип і посилання на Ваш сайт.

Ще один варинат заборони доступу до картинок з невирішених сайтів:

  SetEnvIfNoCase Referer "^ $" local_ref = 1
 SetEnvIfNoCase Referer "^ http: // (www \.)? Htmlweb \ .ru" local_ref = 1
 SetEnvIfNoCase Referer "^ http: // (www \.)? Images \ .yandex \ .ru" local_ref = 1
 SetEnvIfNoCase Referer "^ http: // (www \.)? Hghltd \ .yandex \ .com" local_ref = 1
 Order Allow, Deny
  Allow from env = local_ref

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

  RewriteCond% {HTTP_USER_AGENT} (Googlebot | Slurp | spider | Twiceler | heritrix |
	 Combine | appie | boitho | e-SocietyRobot | Exabot | Nutch | OmniExplorer |
	 MJ12bot | ZyBorg / 1 | Ask \ Jeeves | AskJeeves | ActiveTouristBot |
	 JemmaTheTourist |  agadine3 | BecomeBot | Clustered-Search-Bot |
	 MSIECrawler | freefind | galaxy | genieknows | INGRID | grub-client |
	 MojeekBot | NaverBot | NetNose-Crawler | OnetSzukaj | PrassoSunner |
	 Asterias \ Crawler | THUNDERSTONE | GeorgeTheTouristBot |
	 VoilaBot | Vagabondo | fantomBro wser | stealthBrowser | cloakBrowser |
	 fantomCrew \ Browser | Girafabot | Indy \ Library | Intelliseek | Zealbot |
	 Windows \ 95 | ^ Mozilla / 4 \ .05 \ \ [en \] $ | ^ Mozilla / 4 \ .0 $) [NC]
 RewriteRule ^ (. *) $ - [F]
 #
 RewriteCond% {HTTP_USER_AGENT} ^ Mozilla. * [NC, OR]
 RewriteCond% {HTTP_USER_AGENT} ^ Opera. * [NC, OR]
 RewriteCond% {HTTP_USER_AGENT} ^ Firefox. * [NC, OR]
 RewriteCond% {HTTP_USER_AGENT} ^ Netscape. * [NC]
 RewriteRule ^ (. *) $ - [L]
 RewriteRule ^ (. *) $ - [F]

Відстеження звернень до файлу robots.txt

Щоб мати більше інформації про відвідування пошуковиків, корисно мати докладну інформацій про звернення до файлу robots.txt Для того, щоб оганізовать це, в '.htaccess' повинні бути такі записи:
  RewriteEngine on
  Options + FollowSymlinks
  RewriteBase /
  RewriteRule ^ robots.txt $ /robot.php?%{REQUEST_URI}
Тепер при запиті файлу 'robots.txt' наш RewriteRule переадресує користувача (робота) до обробного запити скрипту robot.php. Крім того, змінна передається скрипту, яка буде оброблена відповідно до ваших потреб. 'REQUEST_URI' визначає ім'я запитуваної файлу. В даному прикладі це - 'robots.txt'. Скрипт прочитає зміст 'robots.txt' і відправить його web-браузеру або роботу пошукового сервера. Таким чином, ми можемо вважати хіти відвідувачів і вести лог-файли.

PHPSESSID

Для відключення додавання PHPSESSID до URL вставте в початок index.php:

  ini_set ( "session.use_trans_sid", 0);

Або в .htaccess пропишіть:

  php_flag session.use_trans_sid Off

Якщо вам все це здалося складним, скористайтеся готовим сервісом перетворення динамічних URL в статичні за допомогою htaccess

директиви кешування

Кешування для всіх типів файлів за часом доступу
  ExpiresActive on
 ExpiresDefault "access plus 600 seconds"
Кешування для всіх типів файлів за часом зміни
  ExpiresActive on
 ExpiresDefault "modification plus 600 seconds"
Кешування для певних типів файлів
  ExpiresByType text / css "modification plus 600 seconds"
 ExpiresByType image / jpeg "modification plus 600 seconds"
 ExpiresByType image / gif "modification plus 600 seconds"
 ExpiresByType image / x-ico "modification plus 600 seconds"
 ExpiresByType image / png "modification plus 600 seconds"

Заборона кешування за допомогою сервера Apache

Відкрийте файл конфігурації сервера Apache httpd.conf і розкоментуйте наступні рядки:

 LoadModule expires_module modules / mod_expires.so
 LoadModule headers_module modules / mod_headers.so 
 ...
 AddModule mod_expires.c
 AddModule mod_headers.c

Впишіть в .htaccess наступне:

  # Заборона кешування в цій папці
 # Необхідно включення модулів
 # Mod_headers.c і mod_expires.c
 #
 # Тема Cache-Control
 Header append Cache-Control "no-store, no-cache, must-revalidate"
 # Тема Expires
 ExpiresActive On
 ExpiresDefault "now"

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

Опис http-заголовка кешування Cache-control

Кешування за допомогою файлу .htaccess

  # Дозвіл кешування в цій папці
 # Необхідно включення модулів
 # Mod_headers.c і mod_expires.c
 #
 # Тема Cache-Control
 Header append Cache-Control "public"
 # Тема Expires
 ExpiresActive On
  ExpiresDefault "access plus 1 hours"
  #ExpiresDefault "access plus 10 years"

Кешування javascript файлів за допомогою файлу .htaccess

 ExpiresDefault "access plus 3 days"

Будьте обережні при кешування, тому що при зміні файлу, користувач може отримати новий варіант тільки через 3 дня!

Як змусити html-сторінки обробляти php-код?

Пропишіть в своєму файлі .htaccess наступні рядки:
  RemoveHandler .php .htm .html
 AddHandler application / x-httpd-php .php .htm .html

Як розмістити кілька сайтів на одному віртуальному хостингу?

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

  RewriteEngine On
 RewriteRule ^ newdirectory / - [L]
 RewriteCond% {HTTP_HOST} (www.)? Newdomain.ru [NC]
 RewriteRule (. *) Newdirectory / $ 1 [L]

де:
newdirectory / - папка, в якій буде лежати другий сайт
newdomain.ru - домен, для якого ми робимо перенаправлення

Зверніть увагу, що при цьому у Вас буде єдиний поштовий акаунт. Тобто якщо, у Вас існує ящик admin@domain.ru, то після підключення домену newdomain.ru у ящика admin@domain.ru з'являється друге ім'я - admin@newdomain.ru. А при створенні будь-якого нового ящика (наприклад info), йому автоматично присвоюються два імені - info@domain.ru і info@newdomain.ru.

Пошук сторінок більше ніж в одному каталозі

Іноді необхідно дозволити веб-сервера шукати сторінки більше ніж в одному каталозі.

  RewriteEngine on

 # По-перше спробуємо знайти це в зазначеному місці / ...
 # ... і якщо знайшли те закінчуємо пошук:
 RewriteCond / your / docroot / dir1 /% {REQUEST_FILENAME} -f
 RewriteRule ^ (. +) / Your / docroot / dir1 / $ 1 [L]

 # По-друге - спробуємо знайти це в pub / ...
 # ... і якщо знайшли те закінчуємо пошук:
 RewriteCond / your / docroot / dir2 /% {REQUEST_FILENAME} -f
 RewriteRule ^ (. +) / Your / docroot / dir2 / $ 1 [L]

 # Інакше продовжуємо для інших директив
 RewriteRule ^ (. +) - [PT]

Віртуальні хости користувачів

Якщо Ви хочете надавати адреси www.subdomain.domain.ru для сторінок користувачів, Ви можете використовувати наступний набір правил для перетворення http://www.subdomain.domain.ru/path у внутрішній шлях / home / subdomain / path:

  RewriteEngine on
 RewriteCond% {HTTP_HOST} ^ www \. [^.] + \. Ru $
 RewriteRule ^ (. +)% {HTTP_HOST} $ 1 [C]
 RewriteRule ^ www \. ([^.] +) \. Ru (. *) / Home / $ 1 $ 2

Руйнуються файли при завантаженні на сервер

Якщо при передачі файлів через форми (при вказаному enctype = "multipart / form-data") бінарні дані пошкоджуються, пропишіть в /cgi-bin/.htaccess директиву:
  CharsetRecodeMultipartForms Off.

Помилка завантаження SWF файлів.
Помилки при зверненні до сторінок, що містять ключові слова,
типу $ _REQUEST

Таке може відбуватися через встановленого модуля в Apache. За замовчуванням він блокує в запитах рядки з SQL аргументами і іншими потенційно небезпечними командами.

Можливі повідомлення про помилку:

Forbidden

You do not have permission to access /adm/index.php on this server. Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
або
Запит небезпечний і був відкинутий.
Додайте в .htaccess
 SecFilterEngine Off
 SecFilterScanPOST Off
Для повідомлення:
"POST /wp-admin/async-upload.php HTTP / 1.1" 406 354 "-" "Shockwave Flash"
можна зняти захист тільки на завантаження файлів на сервер:
 SecFilterEngine Off
 SecFilterScanPOST Off

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

змінні сервера

Це змінні виду% {NAME_OF_VARIABLE}

де NAME_OF_VARIABLE може бути рядком взятої з наступного списку:

HTTP заголовки: з'єднання & запит:
HTTP_USER_AGENT
HTTP_REFERER
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST
HTTP_PROXY_CONNECTION
HTTP_ACCEPT
REMOTE_ADDR
REMOTE_HOST
REMOTE_USER
REMOTE_IDENT
REQUEST_METHOD
SCRIPT_FILENAME
PATH_INFO
QUERY_STRING
AUTH_TYPE
внутрішні сервера: системні: спеціальні:
DOCUMENT_ROOT
SERVER_ADMIN
SERVER_NAME
SERVER_ADDR
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE
TIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIME
API_VERSION
THE_REQUEST
REQUEST_URI
REQUEST_FILENAME
IS_SUBREQ

Ці змінні повністю відповідають названим схожим чином MIME-заголовкам HTTP, і змінним сервера Apache або полях struct tm систем Unix. Ті, що є для mod_rewrite спеціальними включають:

IS_SUBREQ - Буде містити текст «true» якщо запит виконується в поточний момент як підзапит, «false» в іншому випадку. Підзапити можуть бути сгенерірованни модулями яким потрібно мати справу з додатковими файлами або URI для того щоб виконати власні завдання.

API_VERSION - Це версія API модуля Apache (внутрішній інтерфейс між сервером і модулем) в поточній збірці сервера, що визначено в include / ap_mmn.h. API версія модуля відповідає використовуваної версії Apache (для версії Apache 1.3.14, наприклад це 19990320: 10), однак це в основному цікаво авторам модулів.

THE_REQUEST - Повна рядок HTTP запиту відправлена браузером сервера (тобто, «GET /index.html HTTP / 1.1»). Вона не включає будь-які додаткові заголовки відправляються браузером.

REQUEST_URI - Ресурс, запитаний в рядку HTTP запиту.

REQUEST_FILENAME - Повний шлях в файлової системі сервера до файлу або скрипту відповідним цим запитом.

Примітки:

  1. Змінні SCRIPT_FILENAME і REQUEST_FILENAME містять однакові значення, тобто, значення поля filename внутрішньої структури request_rec сервера Apache. Перше ім'я це просто широко відоме ім'я змінної CGI в той час як друге це постійна копія REQUEST_URI (містить значення поля uri структури request_rec).
  2. Є спеціальний формат:% {ENV: змінна} де змінна може бути будь-якої змінної оточення. Це шукається у внутрішніх структурах Apache і (якщо там немає) за допомогою виклику getenv () з процесу Apache сервера.
  3. Є спеціальний формат:% {HTTP: заголовок} де заголовок може бути будь-яким ім'ям HTTP MIME-заголовка. Це шукається в HTTP запиті. Приклад:% {HTTP: Proxy-Connection} значення HTTP заголовка «Proxy-Connection:».
  4. Є спеціальний формат% {LA-U: змінна} випереджальних запитів які виробляються внутрішнім (заснованому на URL) підзапитом для визначення кінцевого значення змінної. Використовуйте це коли ви хочете використовувати змінну для перетворень, яка реально визначається пізніше, в будь-якої фазі API, і таким чином недоступна на даному етапі. Для прикладу коли ви хочете перетворити відповідно змінної REMOTE_USER з контексту сервера (файл httpd.conf) ви повинні використовувати% {LA-U: REMOTE_USER} бо ця змінна встановлюється в фазах авторизації які йдуть після фази трансляції URL в якій і працює mod_rewrite. З іншого боку, через реалізації роботи mod_rewrite в контексті каталогу (файл .htaccess) через Fixup фазу API і через те, фази авторизації йдуть до цієї фази, ви просто можете там використовувати% {REMOTE_USER}.
  5. Є спеціальний формат:% {LA-F: змінна} який створює внутрішній (заснований на імені файлу) підзапит для визначення кінцевого значення змінної. В основному це те ж саме що і формат LA-U наведений вище.

Головна сторінка без дублювання

Зазвичай код головної сторінки фізично розташований в файлі index.html або index.php, але сайт має відкриватися за допомогою одного з запитів: yoursite.ru, yoursite.ru/index.html, www.yoursite.ru і www.yoursite.ru/index .html. Але для пошукових систем це чотири різних URL! Якщо не налаштувати .htaccess вірно, пошуковик додасть в свій індекс чотири однакових сторінки. Це ознака неякісного сайту. Уникнути цієї проблеми можна за допомогою такого коду в .htaccess:

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

Всі сторінки-дублі будуть склеєні перенаправленням з кодом 301 з головною сторінкою - http://www.yoursite.ru/.

Дублі сторінок без слеша в кінці URL

Щоб запобігти ситуації з індексуванням сторінок www.yoursite.ru/about і www.yoursite.ru/about/ як різних, ставимо следущий код:

Зі сторінок без слеша буде встановлено редирект на «слешевие».

  RewriteCond% {REQUEST_FILENAME}! -f
 RewriteCond% {REQUEST_URI}! (. *) / $
 RewriteRule ^ (. *) $ / $ 1 / [R = 301, L]

Збереження файлів замість відкриття

Багато хто бачив, як при спробі завантажити архів з розширенням .rar браузер відкриває його у вигляді простого тексту з мішанини символів. Це означає, що на сервері сайту не налаштоване примусове збереження типів файлів, які не повинні відкриватися в браузері.

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