![Nginx 正则表达式不起作用](https://linux22.com/image/707033/Nginx%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
我正在尝试使用这个正则表达式为每个主机获取不同的 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;
}
}