У меня есть сайт, работающий на 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$";

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

2 ответа2

2

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

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

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

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

2

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .