Linux

Nginx:將文件從目錄重寫到根目錄

  • June 14, 2021

我有在 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。

有什麼建議嗎?

我沒有看到您的完整配置,也不知道您如何以及在何處包含該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;
}

引用自:https://serverfault.com/questions/1066667