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 ...)