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