在子域上配置nginx的多个位置和不同的根文件夹

我希望为我的服务器上的两个不同的文件夹提供子域的根url和子域的目录。这是一个简单的设置,我有,并不是工作…

server {


index index.html index.htm;
server_name test.example.com;


location / {
root /web/test.example.com/www;
}


location /static {
root /web/test.example.com/static;
}
}

在本例中,调用test.example.com/将得到/web/test.example.com/www中的索引文件

并且执行test.example.com/static将会得到/web/test.example.com/static中的索引文件

378818 次浏览

你需要为location /static使用alias指令:

server {


index index.html;
server_name test.example.com;


root /web/test.example.com/www;


location /static/ {
alias /web/test.example.com/static/;
}


}

nginx维基比我更好地解释了根和别名之间的区别:

注意,乍一看它可能与根指令相似,但文档根不会改变,只是用于请求的文件系统路径。请求的位置部分在Nginx发出的请求中被删除。

注意,rootalias对尾随斜杠的处理是不同的。

server {


index index.html index.htm;
server_name test.example.com;


location / {
root /web/test.example.com/www;
}


location /static {
root /web/test.example.com;
}
}

https://nginx.org/en/docs/http/ngx_http_core_module.html#root

定位指令系统是

比如你想要转发所有以/static开头的请求和你在/var/www/static中的数据

一个简单的方法就是把最后一个文件夹和全路径分开

全路径:/var/www/static

最后路径:/static,第一个路径:/var/www

location <lastPath> {
root <FirstPath>;
}

看看你犯了什么错误,怎么解决

你的错误:

location /static {
root /web/test.example.com/static;
}

你的解决方案:

location /static {
root /web/test.example.com;
}

这是一个更复杂的例子。

设置:你有一个网站在example.com和你有一个web应用程序在example.com/webapp

...
server {
listen 443 ssl;
server_name example.com;


root   /usr/share/nginx/html/website_dir;
index  index.html index.htm;
try_files $uri $uri/ /index.html;


location /webapp/ {
alias  /usr/share/nginx/html/webapp_dir/;
index  index.html index.htm;
try_files $uri $uri/ /webapp/index.html;
}
}
...

我特意命名了webapp_dirwebsite_dir。如果你有匹配的名称和文件夹,你可以使用root指令。

这个设置是有效的,并使用Docker进行了测试。

注! !小心这些斜线。和例子中一样。

如果您使用这个命令,我建议您也设置这个命令。

location /static/ {
proxy_set_header Host $host/static; // if you change the directory and the browser can't find your path
alias /web/test.example.com/static/;
}

如果你想检查相同URI的两个不同目录,请使用以下配置:

server {
...
root /var/www/my-site/public/;
...
index index.php index.html index.htm;
...
location / {
root /var/www/old-site/dist/;
try_files $uri $uri/ /index.php$is_args$args;
}
...
}

如果Nginx无法在/var/www/old-site/dist/目录下找到文件,那么它将尝试在/var/www/my-site/public/目录下的文件,但正如我们告诉Nginx要尝试具有$uri $uri/ /index.php$is_args$args模式的文件,因此Nginx将尝试在/var/www/my-site/public/目录下的/index.php$is_args$args。不是$uri

如果你想完成你的fallthrough,那么用/fallthrough$uri替换/index.php$is_args$args,然后将带有别名键的location /fallthrough { ... } 添加到你的目标目录。

https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#root-inside-location-block