Пункт 97. Модуль Apache mod_alias
Директивы, содержащиеся в этом модуле, позволяют манипулировать URL-адресами и контролировать их по мере поступления запросов на сервер. Директивы
Alias
и ScriptAlias
используются для сопоставления URL-адресов и путей файловой системы. Это позволяет использовать контент, который не находится непосредственно под DocumentRoot
частью дерева веб-документов. Директива ScriptAlias
имеет дополнительный эффект, помечая целевой каталог как содержащий только сценарии CGI.
Директивы Redirect
используются для указания клиентам сделать новый запрос с другим URL-адресом. Они часто используются, когда ресурс перемещается в новое место.
Когда директивы Alias
,
ScriptAlias
и
Redirect
используются в разделе <Location>
или <LocationMatch>
, синтаксис выражения можно использовать для управления целевым путем или URL-адресом.
mod_alias
предназначен для решения простых задач по манипулированию URL-адресами. Для более сложных задач, таких как манипулирование строкой запроса, используйте инструменты, предоставляемые
mod_rewrite
.
Порядок обработки
Псевдонимы и перенаправления, встречающиеся в разных контекстах, обрабатываются так же, как и другие директивы, в соответствии со стандартными правилами слияния. Но когда несколько псевдонимов или перенаправлений встречаются в одном контексте (например, в одном <VirtualHost>
разделе), они обрабатываются в определенном порядке.
Во-первых, все перенаправления обрабатываются до обработки псевдонимов, и, следовательно, к запросу, который соответствует Redirect
или RedirectMatch
никогда не будет применен псевдоним. Во-вторых, псевдонимы и перенаправления обрабатываются в том порядке, в котором они указаны в файлах конфигурации, причем первое совпадение имеет приоритет.
По этой причине, когда две или более из этих директив применяются к одному и тому же подпути, вы должны сначала указать наиболее конкретный путь, чтобы все директивы возымели действие. Например, следующая конфигурация будет работать должным образом:
Псевдоним "/foo/bar" "/baz"
Псевдоним "/foo" "/gaq"
Но если бы две вышеуказанные директивы были переставлены по порядку, то
/foo
Alias
всегда совпадало бы перед /foo/bar
Alias
, поэтому последняя директива была бы проигнорирована.
Когда директивы Alias
,
ScriptAlias
и
Redirect
используются в разделе <Location>
или <LocationMatch>
, эти директивы будут иметь приоритет над любыми глобально определенными директивами Alias
,
ScriptAlias
и
. Redirect
Псевдоним Директива
Описание: | Сопоставляет URL-адреса с местоположениями файловой системы |
Синтаксис: | Alias [URL-path]
file-path|directory-path |
Контекст: | конфигурация сервера, виртуальный хост, каталог |
Положение дел: | База |
Модуль: | mod_alias |
Директива Alias
позволяет хранить документы в локальной файловой системе, отличной от
DocumentRoot
. URL-адреса с путем (%-decoded), начинающимся с URL-path , будут сопоставлены с локальными файлами, начинающимися с directory-path . URL
-путь чувствителен к регистру даже в файловых системах, нечувствительных к регистру.
Псевдоним "/image" "/ftp/pub/image"
Запрос на http://example.com/image/foo.gif
заставит сервер вернуть файл /ftp/pub/image/foo.gif
. Сопоставляются только полные сегменты пути, поэтому указанный выше псевдоним не будет соответствовать запросу на http://example.com/imagefoo.gif
. Для более сложного сопоставления с использованием регулярных выражений см. AliasMatch
директиву.
Обратите внимание, что если вы включаете завершающий / в
URL-пути , серверу потребуется завершающий / для расширения псевдонима. То есть, если вы используете
Псевдоним "/icons/" "/usr/local/apache/icons/"
тогда URL-адрес /icons
не будет иметь псевдоним, так как в конце отсутствует /. Точно так же, если вы опускаете косую черту в
URL-пути , вы также должны опустить ее в
пути к файлу .
Обратите внимание, что вам может потребоваться указать дополнительные <Directory>
разделы, которые охватывают назначение псевдонимов. Псевдонимы происходят до
<Directory>
проверки разделов, поэтому затрагивается только назначение псевдонимов. (Обратите внимание, однако, что <Location>
разделы выполняются один раз перед выполнением псевдонимов, поэтому они будут применяться.)
В частности, если вы создаете Alias
каталог вне вашего DocumentRoot
, вам может потребоваться явно разрешить доступ к целевому каталогу.
Псевдоним "/image" "/ftp/pub/image"
<Каталог "/ftp/pub/image">
Требовать все предоставленные
</Каталог>
Любое количество косых черт в параметре URL-пути соответствует любому количеству косых черт в запрошенном URL-пути.
Если Alias
директива используется в
разделе <Location>
или <LocationMatch>
, URL-путь опускается, а путь к файлу интерпретируется с использованием синтаксиса выражения.
Этот синтаксис доступен в Apache 2.4.19 и более поздних версиях.
<Расположение "/изображение">
Псевдоним "/ftp/pub/image"
</местоположение>
<LocationMatch "/ошибка/(?<ЧИСЛО>[0-9]+)">
Псевдоним "/usr/local/apache/errors/%{env:MATCH_NUMBER}.html"
</LocationMatch>
Директива соответствия псевдонимов
Описание: | Сопоставляет URL-адреса с местоположениями файловой системы с помощью регулярных выражений. |
Синтаксис: | AliasMatch regex
file-path|directory-path |
Контекст: | конфигурация сервера, виртуальный хост |
Положение дел: | База |
Модуль: | mod_alias |
Эта директива эквивалентна Alias
, но использует
регулярные выражения вместо простого сопоставления префиксов. Предоставленное регулярное выражение сопоставляется с URL-путем, и если оно совпадает, сервер заменяет любые совпадения в скобках в заданную строку и использует ее в качестве имени файла. Например, чтобы активировать /icons
каталог, можно использовать:
AliasMatch "^/icons(/|$)(.*)" "/usr/local/apache/icons$1$2"
Доступен весь спектр возможностей регулярных выражений . Например, можно создать псевдоним с нечувствительным к регистру соответствием URL-пути:
AliasMatch "(?i)^/image(.*)" "/ftp/pub/image$1"
Одно тонкое различие между Alias
и AliasMatch
заключается в том, что Alias
любая дополнительная часть URI будет автоматически скопирована после совпадающей части в конец пути к файлу с правой стороны, а AliasMatch
не будет. Это означает, что почти во всех случаях вам нужно, чтобы регулярное выражение соответствовало всему URI запроса от начала до конца и использовало подстановку с правой стороны.
Другими словами, простое изменение
Alias
на
AliasMatch
не будет иметь такого же эффекта. Как минимум нужно добавить ^
в начало регулярного выражения и добавить (.*)$
в конец, и добавить $1
в конец замены.
Например, предположим, что вы хотите заменить это на AliasMatch:
Псевдоним "/image/" "/ftp/pub/image/"
Это НЕ эквивалентно - не делайте этого! Это отправит все запросы, содержащие /image/ в любом месте, на /ftp/pub/image/:
AliasMatch "/изображение/" "/ftp/pub/изображение/"
Вот что вам нужно, чтобы получить тот же эффект:
AliasMatch "^/image/(.*)$" "/ftp/pub/image/$1"
Конечно, нет смысла использовать AliasMatch
там, где Alias
будет работать. AliasMatch
позволяет делать более сложные вещи. Например, вы можете обслуживать разные типы файлов из разных каталогов:
AliasMatch "^/image/(.*)\.jpg$" "/files/jpg.images/$1.jpg"
AliasMatch "^/image/(.*)\.gif$" "/files/gif.images/$1.gif"
Несколько начальных косых черт в запрошенном URL-адресе отбрасываются сервером до того, как директивы этого модуля сравниваются с запрошенным URL-путем.
Директива перенаправления
Описание: | Отправляет внешнее перенаправление с просьбой к клиенту получить другой URL-адрес. |
Синтаксис: | Redirect [status] [URL-path]
URL |
Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
Переопределить: | Информация о файле |
Положение дел: | База |
Модуль: | mod_alias |
Директива Redirect
сопоставляет старый URL-адрес с новым, запрашивая у клиента повторную загрузку ресурса в новом месте.
Старый URL-путь — это путь с учетом регистра (%-decoded), начинающийся с косой черты. Относительный путь не допускается.
Новый URL-адрес может быть либо абсолютным URL-адресом, начинающимся со схемы и имени хоста, либо URL-путем, начинающимся с косой черты. В последнем случае будут добавлены схема и имя хоста текущего сервера.
Тогда любой запрос, начинающийся с URL-пути, вернет клиенту запрос на перенаправление по адресу целевого
URL . К целевому URL-адресу будет добавлена дополнительная информация о пути помимо совпавшего
URL-пути.
# Перенаправление на URL-адрес на другом хосте
Перенаправить "/service" "http://foo2.example.com/service"
# Перенаправление на URL на том же хосте
Перенаправить "/один" "/два"
Если клиент запрашивает http://example.com/service/foo.txt
, вместо этого ему будет предложено получить доступ
http://foo2.example.com/service/foo.txt
. Сюда входят запросы с GET
такими параметрами, как
http://example.com/service/foo.pl?q=23&a=42
, они будут перенаправлены на
http://foo2.example.com/service/foo.pl?q=23&a=42
. Обратите внимание, что POST
s будет отброшен.
Сопоставляются только полные сегменты пути, поэтому приведенный выше пример не будет соответствовать запросу для
http://example.com/servicefoo.txt
. Для более сложного сопоставления с использованием синтаксиса выражения опустите аргумент URL-пути, как описано ниже. Кроме того, для сопоставления с использованием регулярных выражений см. RedirectMatch
директиву.
Примечание
Redirect
директивы имеют приоритет над директивами Alias
и ScriptAlias
, независимо от их порядка в файле конфигурации. Redirect
директивы внутри Location имеют приоритет над директивами Redirect
и Alias
с URL-путем .
Если аргумент состояния не указан, перенаправление будет «временным» (состояние HTTP 302). Это указывает клиенту, что ресурс временно перемещен. Аргумент состояния
может использоваться для возврата других кодов состояния HTTP:
- постоянный
- Возвращает статус постоянного перенаправления (301), указывающий, что ресурс перемещен навсегда.
- температура
- Возвращает статус временного перенаправления (302). Это значение по умолчанию.
- видеть другое
- Возвращает статус «Просмотреть другое» (303), указывающий, что ресурс был заменен.
- ушел
- Возвращает статус «Ушел» (410), указывающий, что ресурс был окончательно удален. Когда используется этот статус, аргумент URL должен быть опущен.
Другие коды состояния можно вернуть, указав числовой код состояния в качестве значения status . Если статус находится между 300 и 399, должен присутствовать аргумент URL . Если статус не находится между 300 и 399,
аргумент URL должен быть опущен. Статус должен быть действительным кодом состояния HTTP, известным HTTP-серверу Apache (см. функцию
send_error_response
в http_protocol.c).
Постоянная переадресация "/one" "http://example.com/two"
Перенаправление 303 "/three" "http://example.com/other"
Если Redirect
директива используется в
разделе <Location>
или <LocationMatch>
с опущенным URL-путем , то параметр URL будет интерпретироваться с использованием синтаксиса выражения.
Этот синтаксис доступен в Apache 2.4.19 и более поздних версиях.
<Расположение "/один">
Постоянная переадресация "http://example.com/two"
</местоположение>
<Местоположение "/три">
Перенаправление 303 "http://example.com/other"
</местоположение>
<LocationMatch "/ошибка/(?<ЧИСЛО>[0-9]+)">
Постоянная переадресация "http://example.com/errors/%{env:MATCH_NUMBER}.html"
</LocationMatch>
Директива RedirectMatch
Описание: | Отправляет внешнее перенаправление на основе совпадения регулярного выражения с текущим URL-адресом. |
Синтаксис: | RedirectMatch [status] regex
URL |
Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
Переопределить: | Информация о файле |
Положение дел: | База |
Модуль: | mod_alias |
Эта директива эквивалентна Redirect
, но использует
регулярные выражения вместо простого сопоставления префиксов. Предоставленное регулярное выражение сопоставляется с URL-путем, и если оно совпадает, сервер заменяет любые совпадения в скобках в заданную строку и использует ее в качестве имени файла. Например, чтобы перенаправить все файлы GIF в файлы JPEG с одинаковыми именами на другом сервере, можно использовать:
RedirectMatch "(.*)\.gif$" "http://other.example.com$1.jpg"
Соображения, связанные с различием между
Alias
и ,
AliasMatch
также применимы к различию между
Redirect
и
RedirectMatch
. Подробнее см AliasMatch
.
RedirectPermanent директива
Описание: | Отправляет внешнее постоянное перенаправление с просьбой к клиенту получить другой URL-адрес. |
Синтаксис: | RedirectPermanent URL-path URL |
Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
Переопределить: | Информация о файле |
Положение дел: | База |
Модуль: | mod_alias |
Эта директива сообщает клиенту, что перенаправление является постоянным (статус 301). Точно эквивалентно Redirect
permanent
.
Директива RedirectTemp
Описание: | Отправляет внешнее временное перенаправление с просьбой к клиенту получить другой URL-адрес. |
Синтаксис: | RedirectTemp URL-path URL |
Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
Переопределить: | Информация о файле |
Положение дел: | База |
Модуль: | mod_alias |
Эта директива сообщает клиенту, что перенаправление является временным (статус 302). Точно эквивалентно
Redirect temp
.
Директива ScriptAlias
Описание: | Сопоставляет URL-адрес с расположением в файловой системе и назначает цель как сценарий CGI. |
Синтаксис: | ScriptAlias [URL-path]
file-path|directory-path |
Контекст: | конфигурация сервера, виртуальный хост, каталог |
Положение дел: | База |
Модуль: | mod_alias |
Директива ScriptAlias
ведет себя так же, как и Alias
директива, за исключением того, что она помечает целевой каталог как содержащий сценарии CGI, которые будут обрабатываться обработчиком mod_cgi
'cgi-script. URL-адреса с чувствительным к регистру (%-decoded) путем, начинающимся с URL-path , будут сопоставлены со сценариями, начинающимися со второго аргумента, который является полным путем в локальной файловой системе.
ScriptAlias "/cgi-bin/" "/web/cgi-bin/"
Запрос на http://example.com/cgi-bin/foo
заставит сервер запустить сценарий /web/cgi-bin/foo
. Эта конфигурация по существу эквивалентна:
Псевдоним "/cgi-bin/" "/web/cgi-bin/"
<Расположение "/cgi-bin">
cgi-скрипт SetHandler
Опции +ExecCGI
</местоположение>
ScriptAlias
также может использоваться в сочетании со сценарием или обработчиком, который у вас есть. Например:
ScriptAlias "/cgi-bin/" "/web/cgi-handler.pl"
В этом случае все запрошенные файлы /cgi-bin/
будут обрабатываться файлом, который вы настроили, это позволяет вам использовать свой собственный обработчик. Вы можете использовать это как оболочку для CGI, чтобы вы могли добавлять контент или какое-либо другое действие на заказ.
Безопаснее не размещать CGI-скрипты под ,
DocumentRoot
чтобы избежать случайного раскрытия их исходного кода при изменении конфигурации. Это
ScriptAlias
упрощается за счет одновременного сопоставления URL-адреса и назначения сценариев CGI. Если вы решите поместить свои сценарии CGI в каталог, уже доступный из Интернета, не используйте файлы
ScriptAlias
. Вместо этого используйте
<Directory>
,
SetHandler
и
Options
как в:
<Каталог "/usr/local/apache2/htdocs/cgi-bin">
cgi-скрипт SetHandler
Опции ExecCGI
</Каталог>
Это необходимо, поскольку несколько
URL-путей могут сопоставляться с одним и тем же расположением в файловой системе, что может привести к обходу
ScriptAlias
и раскрытию исходного кода сценариев CGI, если они не ограничены разделом
Directory
.
Если ScriptAlias
директива используется в разделе <Location>
или <LocationMatch>
с опущенным URL-путем, то параметр URL будет интерпретироваться с использованием синтаксиса выражения.
Этот синтаксис доступен в Apache 2.4.19 и более поздних версиях.
<Расположение "/cgi-bin">
ScriptAlias "/web/cgi-bin/"
</местоположение>
<LocationMatch "/cgi-bin/errors/(?<NUMBER>[0-9]+)">
ScriptAlias "/web/cgi-bin/errors/%{env:MATCH_NUMBER}.cgi"
</LocationMatch>
Смотрите также
- Учебник компьютерной графики
Директива ScriptAliasMatch
Описание: | Сопоставляет URL-адрес с расположением в файловой системе с помощью регулярного выражения и назначает цель как сценарий CGI. |
Синтаксис: | ScriptAliasMatch regex
file-path|directory-path |
Контекст: | конфигурация сервера, виртуальный хост |
Положение дел: | База |
Модуль: | mod_alias |
Эта директива эквивалентна ScriptAlias
, но использует
регулярные выражения вместо простого сопоставления префиксов. Предоставленное регулярное выражение сопоставляется с URL-путем, и если оно совпадает, сервер заменяет любые совпадения в скобках в заданную строку и использует ее в качестве имени файла. Например, для активации стандарта /cgi-bin
можно использовать:
ScriptAliasMatch "^/cgi-bin(.*)" "/usr/local/apache/cgi-bin$1"
Что касается AliasMatch, здесь доступен весь спектр возможностей регулярных выражений . Например, можно создать псевдоним с нечувствительным к регистру соответствием URL-пути:
ScriptAliasMatch "(?i)^/cgi-bin(.*)" "/usr/local/apache/cgi-bin$1"
Соображения, связанные с различием между
Alias
и ,
AliasMatch
также применимы к различию между
ScriptAlias
и
ScriptAliasMatch
. Подробнее см AliasMatch
.