Nginx:将文件从目录重写到根目录

Nginx:将文件从目录重写到根目录

我在 Linux 环境中运行 nginx 服务器,它正在处理域www.example1.comwww.example2.com。每个域都有自己的站点地图,因此我需要为每个域加载正确的站点地图,就像它在根目录中一样,例如:

www.example1.com/sitemap.xml实际上是从www.example1.com/sitemaps/1/sitemap.xml

和:

www.example2.com/sitemap.xml实际上是从www.example2.com/sitemaps/2/sitemap.xml

为了实现这一点,我尝试为每个域分配一个值,并根据变量值重写它,如下所示:

在 nginx.conf 中:

map $http_host $domain {
    www.example1.com      1;
    www.example2.com      2;
}

在 sitemap.conf 中:

if($domain=1){
  rewrite sitemaps/1/sitemap(.*)$ /sitemap last;
}
if($domain=2){
  rewrite sitemaps/2/sitemap(.*)$ /sitemap last;
}

但由于某种原因,此配置返回 404。

有什么建议吗?

答案1

我没有看到你的完整配置,也不知道你如何以及在哪里包含该sitemap.conf文件,但我宁愿用完全不同的方式来做。使用你现有的map块,它看起来像

location = /sitemap.xml {
    # use '$domain' variable as a part of the full path to 'sitemap.xml' file
    root /var/www/domain/sitemaps/$domain; # no trailing slash here!
}

甚至可以/sitemaps/N/使用map类似指令获取文件夹的完整路径

map $http_host $sitemap_path {
    www.example1.com      /var/www/example1.com/sitemaps/1;
    www.example2.com      /var/www/example1.com/sitemaps/2;
}

location = /sitemap.xml {
    # use '$sitemap_path' variable as the full path to 'sitemap.xml' file
    root $sitemap_path; # no trailing slash here!
}

如果你仍然想使用该rewrite指令执行此任务,则说明你使用方法不正确。你可以尝试以下方法:

if ($domain=1) {
    rewrite ^/sitemap\.xml$ /sitemaps/1/sitemap.xml last;
}
if ($domain=2) {
    rewrite ^/sitemap\.xml$ /sitemaps/2/sitemap.xml last;
}

甚至更加优化:

if ($domain) {
    rewrite ^/sitemap\.xml$ /sitemaps/$domain/sitemap.xml last;
}

相关内容