Nginx 怎样实现从不同位置提供服务?

Nginx 怎样实现从不同位置提供服务?

我希望我的网站内有不同的子网站,以便每个子网站都匹配不同的位置。

例如,<website>/game/应从 提供内容/var/www/<gamePath>,以及<website>/<blog>应从 提供内容/var/www/<blogPath>。默认情况下,<website>/<anything>应从 提供内容/var/www/html/

我的当前配置如下:

server {
 server_name <website>;
 root /var/www/html;

 location / {
   try_files $uri /index.html =404;
 }

 location /game/ {
   root /var/www/<gamePath>/;
   try_files $uri $uri/ /index.html =404;
  }
 
 location /blog/ {
   root /var/www/<blogPath>/;
   try_files $uri $uri/ /index.html =404;
  }
  <ssl stuff>
}

虽然默认位置有效,并<website>正确提供文件/var/www/html/index.html,但当我尝试执行时<website>/blog/favicon.ico,它不提供图标,而是默认为/var/www/<blogPath>/index.html。这似乎是因为它将blog(位置)附加到 uri,并且它不会匹配任何内容。

我看到过很多关于这个问题的问题,但到目前为止还没有一个答案对我有用。有些人root用 替换每个特定位置内的alias,但如果我这样做,我只会得到 404。其他解决方案尝试重写请求而不是使用 $uri,以避免附加位置。这似乎是可行的方法,但我还没有找到真正有效的正则表达式(也许它们需要我自己无法完成的琐碎修改,因为我尝试过的只是复制和粘贴它们)。

答案1

nginxroot指令的工作原理是将 URI 部分添加到location它尝试为用户提供的文件路径的末尾。

因此,在您的示例中,加载/game/exampleURL 会使 nginx 查找文件/var/www/<gamePath>/game/example

为了进行/game/example加载/var/www/<gamePath>/example,您需要使用以下配置。

location ~ ^/game/(?<filepath>.*)$ {
    root /var/www/<gamePath>/;
    try_files /$filepath /$filepath/ /index.html =404;
}

这告诉 nginx 捕获变量后的字符串/game$filepath然后使用该字符串来定位文件。

另一种选择是使用alias而不是root

相关内容