Статьи

Apache: алиасинг и перенаправление

Обычно клиент отправляет запрос на файл, который либо не существует на сервере, либо существует в другом месте. Это может произойти по разным причинам. Вы можете перемещать свои файлы вокруг сервера (или на совершенно другой сервер), или вы можете захотеть представить логическую структуру файловой системы для подключения клиентов.

Обычно эти действия приводят к mod_alias сообщения об ошибке, но возможности Apache для псевдонимов и перенаправления, доступные благодаря модулю mod_alias , позволяют вам обрабатывать эти сценарии, направляя клиентов в новое местоположение ресурса.

mod_alias также позволяет вам информировать клиентов о том, что запрошенный URL неверен.

Псевдонимы позволяют серверу брать один URL и переводить его в другой. Затем они прозрачно доставляют новый ресурс клиенту, даже не осознавая, что произошло какое-либо перенаправление. Это может быть очень полезно при изменении ссылок вашего сайта на дружественные URL-адреса.

Псевдонимы также могут обращаться к файлам вне корневого каталога общедоступного документа, сопоставляя любую часть файловой системы с веб-пространством, делая их видимыми в Интернете, но не, например, для определенных учетных записей оболочки и сценариев CGI. С другой стороны, иногда вы хотите сообщить клиенту о новом расположении контента и попросить его сделать новый запрос для этого местоположения. Именно здесь вступают в действие директивы, связанные с перенаправлением Apache.


Директива Alias берет путь URL и плавно заменяет его на путь к файлу или каталогу в системе (т. Е. Сопоставляет URL ресурса с его физическим местоположением в файловой системе, независимо от его местоположения):

1
Alias /images/ /ftp/public/images/

Псевдонимы могут также получить доступ к файлам вне публичного корня документа.

Приведенный выше пример сопоставляет префикс /images/ URL с префиксом каталога /ftp/public/images/ ; поэтому запрос к http://www.example-domain.com/images/example-image.jpg автоматически переводится в /ftp/public/images/example-image.jpg .

Обратите внимание, что если вы включаете конечный / в URL-пути, то серверу требуется конечный / для расширения псевдонима. Например, путь URL /images не будет псевдонимом в приведенном выше примере. Точно так же, чтобы исключить косую черту в пути URL, необходимо также исключить косую черту в пути к файлу.


Директива AliasMatch работает так же, как и Alias , но позволяет использовать регулярные выражения для сопоставления шаблона URL с путем к файлу или каталогу. Предоставленное регулярное выражение соответствует запрошенному URL:

1
AliasMatch /images/(.*)$ /ftp/public/images/$1

Этот пример позволяет вам легко и просто ссылаться на файлы изображений из любого прямого подкаталога по относительному пути запрошенного документа. $1 относится к значению соответствующей строки в запрошенном URL. Следовательно, запрос для www.example-site.com/some_dir/images/img1.jpg сопоставляется с /ftp/public/images/img1.jpg . Это также позволяет вам хранить все ваши изображения в одном месте, независимо от того, где они доступны.

Тонкое различие между Alias и AliasMatch заключается в том, что Alias автоматически копирует любую дополнительную часть URI в конец пути к файлу справа. AliasMatch нет.

Другими словами, изменение Alias на AliasMatch не будет иметь такого же эффекта. Как минимум, вам нужно добавить ^ в начало регулярного выражения и $ в конец, и добавить $1 в конец замены. Например, следующее утверждение:

1
Alias /images/ /ftp/public/images/

Не эквивалентно:

1
AliasMatch /images/ /ftp/public/images/

Который отправляет все запросы, которые содержат /images/ в URL к /ftp/public/images/ . Чтобы AliasMatch достиг таких же результатов, вам необходимо использовать следующее:

1
AliasMatch ^/images/(.*)$ /ftp/public/images/$1

Директива ScriptAlias обладает той же функциональностью, что и директива Alias , но также помечает целевой каталог как папку с поддержкой CGI. То есть Apache предполагает, что все файлы, содержащиеся в каталоге, являются сценариями CGI, и он попытается выполнить эти файлы как сценарии CGI, когда получит запрос для одного из файлов.

Сценарии CGI (Common Gateway Interface) — это в основном внешние, автономные, генерирующие контент программы, которые позволяют создавать динамический контент для вашего веб-сайта.

1
ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/

Приведенный выше пример вызывает запрос для http://www.example-site.com/cgi-bin/some_cgi_script пометить каталог /usr/local/apache2/cgi-bin/ как каталог сценария CGI, следовательно, выполняя сценарий /usr/local/apache2/cgi-bin/some_cgi_script . Это имеет тот же эффект, что и следующая альтернативная конфигурация:

1
2
3
4
5
Alias /cgi-bin/ /usr/local/apache2/cgi-bin/
<Location /cgi-bin>
    SetHandler cgi-script
    Options +ExecCGI
</Location>

Директива ScriptAliasMatch ведет себя аналогично ScriptAlias , за исключением того, что она принимает регулярное выражение в качестве исходного URL-адреса вместо простого сопоставления префикса.


mod_alias также позволяет вам информировать клиентов о том, что запрошенный URL-адрес неверен, в результате чего клиент делает еще один запрос для другого ресурса. Это достигается с помощью директивы Redirect .

Директива Redirect работает очень похоже на директиву Alias , за исключением того, что она сопоставляет данный префикс URL-адреса с другим URL-адресом (именно поэтому клиент знает о перенаправлении). Он также может принимать необязательный аргумент status .

1
Redirect permanent /images http://www.another-example-site.com/images

В приведенном выше примере запрос для www.example-site.com/images/img1.gif будет перенаправлен на http://www.another-example-site.com/images/img1.gif .

Если URL-адрес запроса содержит строку запроса, запрос остается без изменений, если только директива Redirect указывает целевой URL-адрес, указывающий новую строку запроса.

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

1
Redirect permanent /images http://www.another-example-site.com/images?q=new-value

Затем запрос на www.example-site.com/images?img-name=1.gif будет сопоставлен с http://www.another-example-site.com/images?q=new-value .

Псевдонимы позволяют серверу брать один URL и переводить его в другой URL.

При выполнении перенаправления сервер отправляет HTTP-ответ с кодом состояния, специфичным для типа перенаправления (в отличие, например, от 200 или 404).

Директива Redirect позволяет указать один из следующих кодов состояния (соответствующие символические имена заключены в квадратные скобки) и, таким образом, возвращен вместе с ответом:

Перенаправления обрабатываются перед псевдонимами, если они находятся в том же контексте.

  • 301 (постоянный): ресурс был навсегда перемещен в новое место. Клиенты с кэшами и прокси должны обновлять свои данные, чтобы они указывали на новый URI, если в заголовке ответа Cache-Control или Expires указано иное. Этот статус также указывает, что прокси-серверы самостоятельно выполняют перенаправление для будущих запросов, не возвращаясь на сервер.
  • 302 (темп): ресурс был временно перемещен в новое место. Клиенты с кэшами и прокси не должны обновлять свои данные, но должны продолжать использовать тот же URL для будущих запросов, если в заголовке ответа Cache-Control или Expires указано иное. Этот статус также указывает прокси-серверу проверять сервер перед выполнением перенаправления для будущих запросов.
  • 303 (см. Другое): Ответ можно найти по другому URL-адресу, и его необходимо получить с помощью запроса GET, независимо от используемого метода исходного запроса. Это указывает на то, что ресурс был заменен.
  • 410 (ушел): ресурс больше не доступен; это было навсегда удалено.

Если аргумент status пропущен, будет принят статус HTTP по умолчанию 302 (временное перенаправление).

Конечно, вы можете использовать любой (действительный!) Статус HTTP, кроме четырех, перечисленных выше, но в этом случае вам нужно будет использовать соответствующие значения кода состояния, поскольку mod_alias определяет только символические имена для указанных выше типов перенаправления. Если вы используете код состояния, который не находится в диапазоне 300-399, то второй аргумент URL (т.е. URL замены) должен быть опущен.


RedirectMatch работает так же, как и директива Redirect , но, как вы, наверное, догадались, в качестве исходного URL-адреса используется регулярное выражение вместо префикса. Это дает вам более гибкий способ сопоставления URL-адресов.

Например, чтобы перенаправить все запросы изображений GIF на другой сервер, вы можете использовать следующее правило:

1
RedirectMatch (.*)\.gif$ http://www.example-site.com$1.gif

И, как и Redirect , RedirectMatch позволяет вам использовать аргумент состояния для указания типа перенаправления. Поскольку в приведенном выше примере явно не задан параметр состояния, предполагается временное перенаправление (302).

У вас также есть еще две директивы, а именно: RedirectPermanent и RedirectTemp , обе из которых работают так же, как Redirect permanent ... и Redirect temp ... соответственно.


Чтобы избежать неожиданных результатов, важно отметить, что все перенаправления обрабатываются перед псевдонимами, если они находятся в одном и том же контексте (например, в одном и том же контейнере <Directory> или <VirtualHost>).

Если сервер получает запрос, соответствующий директиве Redirect или RedirectMatch , он применяет это перенаправление перед обработкой любых псевдонимов.

Это означает, что, если у вас уже настроены совпадающие псевдонимы, они никогда не получат возможность применить, потому что необходимое перенаправление уже произошло.

Во-вторых, псевдонимы и перенаправления применяются в том порядке, в котором они появляются в файлах конфигурации сервера (сначала обработанные, сначала обработанные). По этой причине сначала убедитесь, что вы указали наиболее конкретное правило. Например, следующая конфигурация:

1
2
Alias /sub-dir1/sub-dir2 /dir3
Alias /sub-dir1 /dir4

Имеет другой эффект, чем:

1
2
Alias /sub-dir1 /dir4
Alias /sub-dir1/sub-dir2 /dir3

Где Alias /sub-dir1 /dir4 всегда будет совпадать перед Alias /sub-dir1/sub-dir2 /dir3 .


Сегодня мы рассмотрели возможности и опции, которые вы имеете с mod_alias , что позволяет вам легко и быстро выполнять простые задачи по отображению и перенаправлению URL с минимальными усилиями. Это отличная и легкая утилита, которая выполняет работу без хлопот и минимального потребления ресурсов.

В следующем посте из этой серии будет рассмотрен mod_rewrite , очень мощный и гибкий инструмент, используемый для обработки URL. mod_rewrite позволяет вам задавать неограниченное количество правил и условий, включая серверные переменные, переменные среды, заголовки HTTP, поиск в базе данных и многое другое для управления манипулированием URL на совершенно другом уровне. Будьте на связи!