Директива <Location> ограничивает область применения вложенных директив URL-адресом. Он похож на
<Directory>
директиву и начинает подраздел, который заканчивается директивой
</Location> . <Location> секции обрабатываются в порядке их появления в конфигурационном файле, после чтения <Directory> секций и
файлов и после секций. .htaccess <Files>
<Location> разделы работают полностью вне файловой системы. Это имеет несколько последствий. Самое главное, <Location>
директивы не должны использоваться для управления доступом к расположениям файловой системы. Поскольку несколько разных URL-адресов могут сопоставляться с одним и тем же расположением в файловой системе, такой контроль доступа можно обойти.
Прилагаемые директивы будут применяться к запросу, если компонент пути URL-адреса соответствует любому из следующих критериев:
- Указанное местоположение точно соответствует компоненту пути URL-адреса.
- Указанное местоположение, оканчивающееся косой чертой, является префиксом компонента пути URL-адреса (рассматривается как корень контекста).
- Указанное местоположение с добавлением завершающей косой черты является префиксом компонента пути URL-адреса (также рассматривается как корень контекста).
В приведенном ниже примере, где косая черта в конце не используется, к запросам к /private1, /private1/ и /private1/file.txt будут применены вложенные директивы, а к /private1other — нет.
<Location "/private1">
# ...
</Location>
В приведенном ниже примере, где используется завершающая косая черта, к запросам к /private2/ и /private2/file.txt будут применены вложенные директивы, а к /private2 и /private2other — нет.
<Location "/private2/">
# ...
</Location>
Когда использовать <Location>
Используйте <Location> для применения директив к содержимому, находящемуся вне файловой системы. Для содержимого, находящегося в файловой системе, используйте <Directory> и <Files> . Исключением является
<Location "/"> , который представляет собой простой способ применить конфигурацию ко всему серверу.
Для всех исходных (не прокси) запросов сопоставляемый URL-адрес представляет собой URL-путь в форме /path/ . Нельзя включать схему, имя хоста, порт или строку запроса. Для прокси-запросов сопоставляемый URL-адрес имеет форму
scheme://servername/path , и вы должны включать префикс.
URL-адрес может использовать подстановочные знаки. В строке с подстановочными знаками ? соответствует любому одиночному символу и * соответствует любой последовательности символов. Ни один подстановочный знак не соответствует / в URL-пути.
Также можно использовать регулярные выражения
с добавлением символа ~
. Например:
<Location ~ "/(extra|special)/data">
#...
</Location>
будет соответствовать URL-адресам, содержащим подстроку /extra/data
или /special/data . Директива <LocationMatch> ведет себя так же, как версия регулярного выражения <Location> , и предпочтительнее по той простой причине, что ~ ее трудно отличить
- во многих шрифтах.
Функциональность <Location>
особенно полезна в сочетании с директивой
SetHandler
. Например, чтобы включить запросы статуса, но разрешить их только из браузеров в example.com , вы можете использовать:
<Location "/status">
SetHandler server-status
Require host example.com
</Location>
Примечание о / (косая черта)
Символ косой черты имеет особое значение в зависимости от того, где в URL-адресе он появляется. Люди могут привыкнуть к его поведению в файловой системе, где несколько смежных косых черт часто сворачиваются в одну косую черту ( т.е. /home///foo это то же самое
, что и /home/foo ). В URL-пространстве это не обязательно верно. Директива <LocationMatch>
и версия регулярного выражения <Location> требуют, чтобы вы явно указали несколько косых черт, если это ваше намерение.
Например, <LocationMatch "^/abc"> будет соответствовать URL-адресу запроса /abc , но не URL-адресу запроса
//abc . Директива (non-regex) <Location> ведет себя аналогично при использовании для прокси-запросов. Но когда (non-regex) <Location> используется для запросов без прокси, он будет неявно сопоставлять несколько косых черт с одной косой чертой. Например, если вы укажете <Location "/abc/def"> и запрос будет, /abc//def то он будет соответствовать.
Смотрите также
- Как работают разделы <Directory>, <Location> и <Files> для объяснения того, как эти разные разделы объединяются при получении запроса.
-
LocationMatch