我希望为我的服务器上的两个不同的文件夹提供子域的根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


你需要使用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 wiki解释根和别名之间的区别比我更好:

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

注意,根和别名以不同的方式处理后面的斜杠。


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上有一个网站,在example.com/webapp上有一个web应用程序

...
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_dir和website_dir。如果你有匹配的名称和文件夹,你可以使用根指令。

这个设置是有效的,并使用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/目录下找不到file,那么它会尝试在/var/www/my-site/public/目录下找file,但是就像我们告诉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,然后添加位置/fallthrough{…}使用别名键到目标目录。

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