Nginx nome do servidor regex allow dash

0

Eu tenho um site, rodando em nginx, quando se trata do nome do servidor eu me deparo com algum problema em relação ao regex, como eu sei nginx está usando Perl Compatible Regular Expressions (PCRE).

Agora, o nome do meu servidor:

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

Por isso, só permite casos como os seguintes:

abc.parentdomain.com

Mas eu quero permitir traço no meu subdomínio, como

abc-def.parentdomain.com

Eu tentei modificar o padrão, mas sem sorte

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

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

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

Há algo de errado com o meu regex?

    
por hades 03.10.2018 / 05:13

2 respostas

2

Simplesmente colocar um após o outro não os transformará em alternativas - apenas fará uma sequência. Você está permitindo uma série de caracteres de palavras e então um traço. Por exemplo, subdom-.example.com .

Você precisa marcar explicitamente essas classes como alternativas, por exemplo, (\w|-) ou [\w-] .

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

(Pense nisso: se o PCRE automaticamente transformasse tudo em alternativas, ter a palavra "parentdomain" no regex não permitiria "parentdomain" - ele permitiria "p" ou "a" ou "r" ou "e" ou ...)

    
por 03.10.2018 / 08:54
2

Se você quiser permitir traços entre caractere de palavra:

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

Onde

(?:-\w+)* é um grupo sem captura que permite um traço seguido por alguns caracteres de palavra, o grupo pode aparecem 0 ou mais vezes. Não corresponde a traços consecutivos.

Corresponde:

  • subdomain.parentdomain.com
  • sub-domain.parentdomain.com
  • sub-do-main.parentdomain.com
  • e assim por diante ...

mas não

  • sub--domain.parentdomain.com
  • -subdomain.parentdomain.com
  • subdomain-.parentdomain.com
  • ---.parentdomain.com
por 03.10.2018 / 10:48

Tags