Apache аліасинг та редирект

apache

За допомогою аліасів ви також можете організувати доступ до файлів, що знаходяться за межами Document Root сервера, таким чином надавши прямий доступ до будь-якої частини сервера ФС, не вдаючись до використання CGI-сценаріїв. Використовуючи редирект, ви отримуєте можливість фізично перенаправляти клієнтів на потрібні URL-адреси.

Директива Alias

ДирективаAlias дозволяє непомітно для клієнтів пов'язувати запитувану URL-адресу з будь-якою частиною файлової системи сервера. Наприклад:

Директива в прикладі вище призведе до того, що Apache перед тим, як шукати контент у файловій системі, у рядку запиту замінить /images/ на /ftp/public/images/ . Таким чином, запит URL http://www.example-domain.com/images/example-image.jpg змусить шукати Apache файл example-image.jpg у фізичному каталозі /ftp/public/images/ замість каталогу DOCUMENT_ROOT/images .

Зверніть увагу на те, що завершальний сліш має значення. Наведений вище приклад не спрацював би, якби ми опустили завершальний сліш у першому параметрі Alias. Також, аліасинг не спрацював би у разі, якби клієнт запросив URL, в якому після /images був відсутній завершальний сліш.

Директива AliasMatch

Директива AliasMatch працює так само, як і Alias, при цьому дозволяє використовувати регулярні вирази для визначення вихідних URL:

У цьому прикладі показано, як легко зв'язати відносну частину запитуваного URL з частиною фізичної файлової системи. Змінна $1 пов'язана з першою відповідністю, виявленою в дужках регулярного виразу, $2 — з другою, і так далі. Таким чином, на прикладі вище, запит URL http://www.example-site.com/some_dir/images/img1.jpg призведе до отримання файлу /ftp/public/images/img1.jpg .Використовуючи цю директиву, можна, наприклад, зберігати всі зображення в одному дереві каталогів, незалежно від відносного положення підрядка /images/ у рядку запиту.

Істотною різницею між Alias ​​та AliasMatch є їх поведінка. Різниця полягає в тому, що Alias ​​копіює частину рядка запиту, що залишилася після віднімання з неї першого параметра директиви, в той час як AliasMatch — ні. Тобто:

зовсім не еквівалентна

оскільки друга транслюватиме всі запити, що містять підрядок /images/ до каталогу /ftp/public/images/ , не додаючи при перезаписі імен файлів. Щоб отримати те, що потрібно, вам знадобиться така інструкція:

Директива ScriptAlias

Призначення цієї директиви таке ж, як і Alias, проте при цьому Apache вважає кінцевий каталог таким, який зберігає CGI-сценарії, що виконуються. Тобто після трансляції запиту і визначення кінцевого шляху файлу, що запитується, Apache спробує виконати останній, як CGI-сценарій.

У наведеному прикладі запит http://www.example-site.com/cgi-bin/some_cgi_script призведе до виконання сценарію, розташованого у файлі /usr/local/apache2/cgi-bin/some_cgi_script. Альтернативний варіант такої конфігурації можна описати наступним набором інструкцій:

Директива ScriptAliasMatch

Ця директива аналогічна до попередньої, проте вміє працювати з регулярними виразами, як і AliasMatch.

Директива Redirect

mod_alias до всього іншого дозволяє явно повідомляти клієнтам про те, що запитаний ними URL є некоректним, повідомляючи інший URL, яким можна знайти необхідний контент. Для керування такими перенаправленнями використовується директива Redirect.

Ця директива працює подібно до Alias, тільки замістьтого, щоб виконувати перенаправлення всередині сервера, вона надсилає команду перенаправлення клієнту. Опціональним параметром директиви є тип перенаправлення, що повідомляється клієнту кодом HTTP-статусу відповіді (про це трохи нижче).

У наведеному прикладі запит URL http://www.example-site.com/images/img1.gif призведе до перенаправлення на http://www.another-example-site.com/images/img1.gif.

Якщо запитувана URL містить query string, то вона буде залишена без змін, тільки якщо це явно не визначено останнім параметром директиви Redirect .

Наприклад, правило, розглянуте вище, запит URL http://www.example-site.com/images?img-name=1.gif перенаправить на http://www.another-example-site.com/images?img- name = 1.gif. Однак, якщо ми перепишемо правило так:

той же запит буде перенаправлений на http://www.another-example-site.com/images?q=new-value .

Тепер про типи перенаправлення. Для того, щоб повідомити клієнта про необхідність перенаправлення на іншу URL-адресу, сервер використовує HTTP статус-коди. За допомогою директиви Redirect можна визначити один із чотирьох HTTP-кодів перенаправлення (у дужках вказано символічне ім'я, яке можна використовувати замість номера коду).

303 (seeother). Ресурс був заміщений іншим ресурсом і клієнт повинен виконати перенаправлення, використовуючи метод GET незалежно від того, який метод використовувався для запиту оригінального ресурсу.

410 (gone). Ресурс був видалений і недоступний.

Якщо статус-аргумент буде опущений, то за умовчанням використовуватиметься 302-редирект. Насправді, ви можете використовувати будь-який HTTP-статус, а не тільки чотири з представлених вище. Пам'ятайте тільки, що якщо ви використовуєте HTTP-статус, який не потрапляє в діапазон 300-399,останній аргумент директиви має бути опущений.

Директива RedirectMatch

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

Так само, як і попередня директва, RedirectMatch приймає опціональний параметр HTTP статус коду. У прикладі вище він не вказаний, і тому використовуватиметься код 302.

Також, у сімействі Redirect* є ще дві директиви: RedirectPermanent і RedirectTemp, які семантично еквіваленти виразів Redirect permanent і Redirect temp відповідно.

Порядок обробки директив

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

Коли сервер отримує запит, що відповідає умовам Redirect або RedirectMatch , то інструкції цих директив будуть оброблені перш, ніж інструкції директив Alias ​​і AliasMatch . Це означає те, що в подібних ситуаціях директиви Alias* ніколи не спрацьовуватимуть, оскільки виконатиметься редирект.

Другий момент, про який завжди завжди пам'ятати, це те, що директиви Alias ​​і Redirect застосовуються в тому порядку, в якому вони з'являються. З цієї причини найчастіше більш розумно визначати загальніші правила в останню чергу. Наприклад, інструкції:

НЕ працюватимуть так само, як і:

оскільки Alias ​​/sub-dir1 /dir4 спрацьовуватиме завжди до того, як дійде черга до Alias ​​/sub-dir1/sub-dir2/dir3 .