我正在尝试使用这个正则表达式为每个主机获取不同的 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;
}
}