Nginx 服务器名称正则表达式允许破折号

Nginx 服务器名称正则表达式允许破折号

我有一个在 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$";

我的正则表达式有问题吗?

答案1

简单地将一个接一个地放置不会将它们变成替代方案——它只会形成一个序列。你允许一系列单词字符,并且然后破折号。例如subdom-.example.com

您需要明确将这些类标记为替代方案,例如(\w|-)[\w-]

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

(想想看:如果 PCRE 自动将所有内容转换为替代方案,那么正则表达式中的“parentdomain”一词实际上并不允许“parentdomain” - 它会允许“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

相关内容