Предисловие
Я очень новичок в отношении веб-серверов. Я настраиваю сервер Apache2 и в настоящее время изучаю документацию.
Я заметил , что <Directory>
, <Location>
и <Files>
директивы имеют соответствующую <*Match>
директиву: <DirectoryMatch>
, <LocationMatch>
и <FilesMatch>
соответственно. Разница на поверхности достаточно очевидна:
<*Match>
директивы принимают регулярное выражение в качестве аргумента- Директивы Non-Match принимают в качестве аргумента обычную строку или глобус в стиле оболочки.
Любопытно, что директивам, отличным от Match, также может быть задано регулярное выражение в качестве аргумента, если ему предшествует '~'. Таким образом, следующие две строки должны быть идентичны:
# From the Apache2 docs
<Directory ~ "^/www/[0-9]{3}"> ... </Directory>
<DirectoryMatch "^/www/[0-9]{3}"> ... </DirectoryMatch>
Вопросов
Что я хотел бы знать, так это то, есть ли какие-то тонкие или ключевые отличия, о которых нужно знать, что документы Apachecore
не упоминаются. В <DirectoryMatch>
разделе упоминается одно тонкое отличие:
Совместимость
До 2.3.9 эта директива неявно применялась к подкаталогам (вроде
<Directory>
) и не могла соответствовать символу конца строки ($). В 2.3.9 и позже только вложенные директивы влияют только на каталоги.
Помимо этого, я хотел бы знать:
- Есть ли другие различия между директивами Match и Non-Match?
- Какая директива более предпочтительна, когда требуется регулярное выражение?
- Любая другая информация, которую вы считаете уместной?
Ноты
<DirectoryMatch>
и<Directory "~">
находятся на одном уровне слияния- Хотя это и не указано явно,
<Directory "~">
может использовать именованные группы и обратные ссылки, как<DirectoryMatch>
.
источник
<Directory ~
и<DirectoryMatch
нет<Directory
. До Apache 2.3.9,<Directory ~
возможно , был надмножеством, потому что он поддерживал$
привязку регулярных выражений, тогда как<DirectoryMatch
не поддерживал . (Возможно, поэтому рекомендация по использованиюDirectoryMatch
была удалена в более ранних документах?)DirectoryMatch
все еще лучше, потому чтоDirectory ~
обрабатываются только после« нормальных »Directory
операторов иDirectoryMatch
позволяет вам собирать данные, которые вы можете впоследствии использовать». - но, как отмечено ФП, эти директивы одинаковы в обоих этих отношениях.DirectoryMatch
легче читать и, следовательно, предпочтительнее (болееDirectory ~
). Хотя в документах это явно не указано,DirectoryMatch
оно используется во всех недавних примерах (например, на странице « Разделы конфигурации» ) иDirectory ~
никогда не упоминается. Документы, тем не менее, прямо заявляют, что аналогично названыLocationMatch
иFilesMatch
являются предпочтительными по сравнению с соответствующей~
версией этих директив.DirectoryMatch
не поддерживал привязку$
до Apache 2.3.9? Коммиты, которые я обнаружил, связаны с Apache 1.2 / 1.3, до этого.<Directory ~
даже был указатель конца строки. Да, я вижу, что эти коммиты от 1.2 / 1.3 - хорошо копать! :) Это также указано в документации Apache 1.3, когда онаDirectoryMatch
была представлена. Также произошли изменения в Apache 1.3 (от 1.2) в отношении того, как слились контейнеры регулярных выражений (то есть<Directory ~
и только что введенные<DirectoryMatch
).Не строго различие между двумя версиями регулярных выражений (
<Directory ~
и<DirectoryMatch
), но некоторые директивы, такие какAllowOverride
иAllowOverrideList
, разрешены только в простом (не регулярном выражении)<Directory>
контейнере. Таким образом, это исключает как<Directory ~
и<DirectoryMatch
.Ссылка:
https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride
источник