Nginx 正则表达式不起作用

Nginx 正则表达式不起作用

我正在尝试使用这个正则表达式为每个主机获取不同的 sitemap.xml ,而不包含子域:

  rewrite "([a-zA-Z\d-]+).([a-zA-Z\d-]+\.([a-z]{2,3}))\/sitemap.xml" /sitemaps/$2.xml;

正如你在这里看到的https://regex101.com/r/WVQQ27/1正则表达式有效,第二个捕获组应该是没有子域的主机。

但由于某种原因,我一直收到 404。有什么想法吗?

技术背景是,我们为不同的域设置了不同的站点地图,但它们之间也共享内容,具体取决于同一应用程序所提供内容的语言。

答案1

  if ($host ~* "([a-zA-Z\d-]+).([a-zA-Z\d-]+\.([a-z]{2,3}))") {
      set $host_without_www $2;
      rewrite /sitemap.xml /sitemaps/$host_without_www.xml;
  }

有效但要注意这if被认为是邪恶的:https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/

但是,在这种情况下它对我们来说是有效的,但如果有人知道更好的方法,我愿意改进它。

答案2

map $host $domain {
  ~(?<cap>[^.]+\.[^.]+)$ $cap;
}

server {
  location = /sitemap.xml {
    try_files /sitemaps/$domain.xml =404;
  }
}

相关内容