Имя сервера Nginx регулярное выражение разрешить тире

605
hades

У меня есть сайт, работающий на nginx, когда приходит имя сервера, я сталкиваюсь с некоторой проблемой, связанной с регулярным выражением, поскольку я знаю, что nginx использует регулярные выражения, совместимые с Perl (PCRE).

Теперь имя моего сервера:

server_name "~^(?<subdomain>\w+)\.parentdomain\.com$";

Таким образом, он допускает только случай, подобный следующему:

abc.parentdomain.com

Но я хочу разрешить тире в моем поддомене, как

abc-def.parentdomain.com

Я пытался изменить шаблон, но не повезло

server_name "~^(?<subdomain>\w\-+)\.parentdomain\.com$";

server_name "~^(?<subdomain>\w+\-)\.parentdomain\.com$";

server_name "~^(?<subdomain>\w+)(\-)\.parentdomain\.com$";

Что-то не так с моим регулярным выражением?

0

2 ответа на вопрос

2
grawity

Простое размещение одного за другим не превратит их в альтернативы - это будет просто последовательность. Вы позволяете серию символов слова, а затем тире. Например subdom-.example.com.

Вам необходимо явно пометить эти классы как альтернативы, например, (\w|-)или [\w-].

server_name "~^(?<subdomain>(\w|-)+)\.parentdomain\.com$"; server_name "~^(?<subdomain>[\w-]+)\.parentdomain\.com$"; 

(Подумайте об этом: если PCRE автоматически превратит все в альтернативы, то наличие слова «родительский домен» в регулярном выражении фактически не разрешит «родительский домен» - это разрешит либо «p», либо «a», либо «r», либо «e». " или же...)

2
Toto

Если вы хотите разрешить тире между символами слова:

server_name "~^(?<subdomain>\w+(?:-\w+)*)\.parentdomain\.com$"; 

куда

(?:-\w+)*является группой без захвата, которая допускает тире, за которым следуют некоторые символы слова, группа может появляться 0 или более раз. Это не соответствует последовательным тире.

Это соответствует:

  • subdomain.parentdomain.com
  • sub-domain.parentdomain.com
  • sub-do-main.parentdomain.com
  • и так далее...

но нет

  • sub--domain.parentdomain.com
  • -subdomain.parentdomain.com
  • subdomain-.parentdomain.com
  • ---.parentdomain.com

Похожие вопросы