![带有正则表达式的 nginx 动态服务器名不适用于 co.uk](https://linux22.com/image/619722/%E5%B8%A6%E6%9C%89%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%9A%84%20nginx%20%E5%8A%A8%E6%80%81%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%90%8D%E4%B8%8D%E9%80%82%E7%94%A8%E4%BA%8E%20co.uk.png)
我正在尝试设置一个 nginx 服务器,以便动态加载域中某个文件夹的内容。为此,我在服务器名称中使用正则表达式,如下所示:
server_name ((?<subdomain>.+)\.)?(?<domain>.+)\.(?<tld>.*);
这将创建 3 个变量供 nginx 稍后使用,例如当使用以下 url 时:test.foo.example.com
其计算结果为:
- $子域名 = test.foo
- $domain = 示例
- $tld = com
当使用 co.uk 顶级域名时,就会出现问题。在这种情况下,使用 url 时,test.foo.example.co.uk
它将评估为:
- $子域名 = test.foo.cedira
- $domain = co
- $tld = 英国
我如何编辑正则表达式以使其也适用于 co.uk?
答案1
这能够检查 www 部分,并且它仅将第一个捕获作为子域,第二个捕获作为域,其余部分作为主机域:
server_name ~^(www\.)?((?<subdomain>.+?)\.)?((?<domain>.+?)\.)?(?<host_domain>.+)\.(?<tld>co.uk)$ ~^(www\.)?((?<subdomain>.+?)\.)?((?<domain>.+?)\.)?(?<host_domain>.+)\.(?<tld>.*)$;
答案2
我发现可以定义多个 server_name,因此我简单地将两个正则表达式作为 server_name,如果第一个失败,它将自动选择第二个。
server_name ~^((?<subdomain>.+)\.)?(?<domain>.+)\.(?<tld>co.uk)$ ~^((?<subdomain>.+)\.)?(?<domain>.+)\.(?<tld>.*)$;
我猜它也可以用一个正则表达式来完成,我仍然想知道如何做,但现在我将使用这个解决方案。