регулярное выражение mod_alias AliasMatch - сопоставление всего в папке, кроме двух шаблонов?

StackOverflow https://stackoverflow.com/questions/1352920

  •  20-09-2019
  •  | 
  •  

Вопрос

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

Например, следующее соответствие псевдонимов создает псевдоним для всего, что находится в папке "содержимое":

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.

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

Это было полезно?

Решение

То, о чем вы говорите, называется негативный взгляд, и вы просто обертываете его вокруг регулярного выражения для того, чему вы не хотите соответствовать, вот так: (?!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 - моя специальность - регулярные выражения, и я не думаю, что регулярное выражение решит вашу проблему.

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top