mod_alias AliasMatch Regex - сопоставить все в папке, кроме двух шаблонов? - PullRequest
0 голосов
/ 30 августа 2009

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

Например, следующий AliasMatch создает псевдоним для всего в папке 'content':

AliasMatch /content(.*) /home/username/public_html/$1

Но есть два шаблона регулярных выражений, которым я не хочу, чтобы вышеуказанный псевдоним совпадал, например:

^content/([a-zA-Z0-9_-]+)/id-([a-zA-Z0-9_-]+)/([0-9]+)
^content/([a-zA-Z0-9_-]+)/nn-([a-zA-Z0-9_-]+)

Я знаю, что символ NOT (!) Можно использовать для отрицания шаблона, но я не знаю, как использовать его здесь или как отрицать несколько шаблонов в AliasMatch.

Как это могло быть сделано?

Ответы [ 2 ]

3 голосов
/ 02 октября 2012

ModAlias ​​фактически поддерживает негативные взгляды. Я использую это на своем сайте, который работает очень хорошо:

AliasMatch ^/(?!w/|BingSiteAuth\.xml$|favicon\.ico$|google.{16}\.html$|robots\.txt$) /path/to/file

Убедитесь, что ваше регулярное выражение начинается с "/", так как это всегда первый символ с mod_alias! Никогда не пытайтесь начать свое правило с предвкушения, иначе анализ не удастся.

1 голос
/ 30 августа 2009

То, о чем вы говорите, называется отрицательный взгляд , и вы просто заключаете его в регулярное выражение для того, что вы не хотите сопоставлять, например: (?!foo). Объединить регулярные выражения можно так же просто, как связать их вместе с помощью канала между ними, но в этом случае вы можете сделать это немного лучше. Это регулярное выражение повторно использует первую часть двух регулярных выражений, которая идентична:

[a-zA-Z0-9_-]+/(?:id-[a-zA-Z0-9_-]+/[0-9]+|nn-[a-zA-Z0-9_-]+)

Поскольку канал (или '|', оператор чередования) имеет более низкий приоритет, чем что-либо еще, чередование должно содержаться в группе. Обратите внимание, что я использовал группу без захвата - то есть (?:...) - и избавился от скобок в ваших регулярных выражениях. В противном случае они скинули бы нумерацию той группы, которую вы делайте , которую хотите захватить, и вам пришлось бы использовать что-то отличное от $1 во второй части правила. Вот все регулярное выражение:

^/content(?![a-zA-Z0-9_-]+/(?:id-[a-zA-Z0-9_-]+/[0-9]+|nn-[a-zA-Z0-9_-]+))(.*)

РЕДАКТИРОВАТЬ: Очевидно, что регулярное выражение, используемое AliasMatch, не поддерживает прогнозирование, но имеет собственный синтаксис отрицания: !(^/foo). Похоже, что его целью является отрицание всего регулярного выражения, что означает, что это не поможет вам, но, возможно, вам это не нужно. Может быть, вы можете просто псевдоним этих каталогов для себя. Тогда вам не придется ничего отрицать.

AliasMatch ^(/content/[a-zA-Z0-9_-]+/id-[a-zA-Z0-9_-]+/[0-9]+.*) $1
AliasMatch ^(/content/[a-zA-Z0-9_-]+/nn-[a-zA-Z0-9_-]+.*) $1
AliasMatch ^/content/(.*) /home/username/public_html/$1

Или, может быть, вы можете что-то сделать с помощью директивы <DirectoryMatch>, или переключившись на mod_rewrite. Но я (очевидно) не эксперт по Apache - моя специальность - регулярные выражения, и я не думаю, что регулярное выражение решит вашу проблему.

...