带有正则表达式的 nginx 动态服务器名不适用于 co.uk

带有正则表达式的 nginx 动态服务器名不适用于 co.uk

我正在尝试设置一个 nginx 服务器,以便动态加载域中某个文件夹的内容。为此,我在服务器名称中使用正则表达式,如下所示:

server_name ((?<subdomain>.+)\.)?(?<domain>.+)\.(?<tld>.*);

这将创建 3 个变量供 nginx 稍后使用,例如当使用以下 url 时:test.foo.example.com其计算结果为:

  1. $子域名 = test.foo
  2. $domain = 示例
  3. $tld = com

当使用 co.uk 顶级域名时,就会出现问题。在这种情况下,使用 url 时,test.foo.example.co.uk它将评估为:

  1. $子域名 = test.foo.cedira
  2. $domain = co
  3. $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>.*)$;

我猜它也可以用一个正则表达式来完成,我仍然想知道如何做,但现在我将使用这个解决方案。

相关内容