我希望我的网站内有不同的子网站,以便每个子网站都匹配不同的位置。
例如,<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/example
URL 会使 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
。