Nginx正在提供默认内容而不是我的内容

时间:2018-02-08 15:00:53

标签: nginx configuration server configuration-files nginx-location

我在nginx version: nginx/1.10.3 (Ubuntu)上运行Ubuntu 16.04.2 LTS

我使用nginx来提供静态文件,由webpack生成的捆绑包,但这是非常的。

我想要实现的目标是:

example.com我需要投放/home/bundles/main/index.html。我可以这样做。

projects.example.com/project_1我想提供/home/bundles/project_1/index.html

projects.example.com/project_2我想提供/home/bundles/project_2/index.html

最后两个,我做不到。当我转到projects.example.com/project_1projects.example.com/project_2时,我会收到默认的nginx页面。

让事情变得更加混乱/etc/nginx/sites-enabled/default完全被注释掉了。

此外,如果在我location的{​​{1}}区块中,我将projects.example.com替换为project_1,我将会为该特定项目提供服务,但之后我会无法为对方服务。

贝娄,我会告诉你我的nginx配置

/

感谢您的帮助!

修改

我的回答

我找到的解决方案是使用server { listen 80; server_name example.com; location / { root /home/bundles/main; try_files $uri /index.html; } if ($scheme != "https") { return 301 https://$host$request_uri; } } server { listen 443 ssl; server_name example.com; location / { root /home/bundles/main; try_files $uri /index.html; } ssl_certificate ... ssl_certificate_key ... } server { listen 80; server_name projects.example.com; location /project_1 { root /home/bundles/project_1; try_files $uri /index.html; } location /project_2 { root /home/bundles/project_2; try_files $uri /index.html; } if ($scheme != "https") { return 301 https://$host$request_uri; } } server { listen 443 ssl; server_name projects.example.com; location /project_1 { root /home/bundles/project_1; try_files $uri /index.html; } location /project_2 { root /home/bundles/project_2; try_files $uri /index.html; } ssl_certificate ... ssl_certificate_key ... } 更改root

alias

解决方案基于这两个答案。第一个answer显示如何解决问题,第二个answer提供有关server { listen 80; server_name example.com; location / { root /home/bundles/main; try_files $uri /index.html; } if ($scheme != "https") { return 301 https://$host$request_uri; } } server { listen 443 ssl; server_name example.com; location / { root /home/bundles/main; try_files $uri /index.html; } ssl_certificate ... ssl_certificate_key ... } server { listen 80; server_name projects.example.com; location /project_1 { alias /home/bundles/project_1; index index.html; } location /project_2 { alias /home/bundles/project_2; index index.html; } if ($scheme != "https") { return 301 https://$host$request_uri; } } server { listen 443 ssl; server_name projects.example.com; location /project_1 { alias /home/bundles/project_1; index index.html; } location /project_2 { alias /home/bundles/project_2; index index.html; } ssl_certificate ... ssl_certificate_key ... } 工作原因和alias的解释。

引用@treecoder

  

如果是root指令,则将完整路径附加到根,包括位置部分,而在alias指令的情况下,只有路径中不包括位置部分的部分会附加到别名。

在我的特定情况下,这会像这样翻译;

使用root,尝试访问的路径root将为nginx

使用/home/bundles/project_1/project_1,它会访问正确的路径alias

回到一个级别,例如,说:

/home/bundles/project_1也不是一个真正的选择。这是因为我的项目实际上并没有被称为root /home/bundles/project_1。实际结构更类似于此。

project_2我有目录/bundlesproject_a。我想将project_b路由到project_1目录,将project_a路由到project_2目录。

这就是我使用project_b的原因。

我希望这会有所帮助。

2 个答案:

答案 0 :(得分:1)

你有:

location /project_1 {
    root /home/bundles/project_1;
    try_files $uri /index.html;
}

因此root仅针对以/project_1开头的URI定义。对于任何其他URI,将使用默认的root

如果您展示URI /project_1/(尾随/),假设default index directive生效,nginx应该返回您的/project_1/index.html内容

但是,找不到URI /project_1 - 因此会返回/index.html。 URI /index.html不以/project_1开头,因此使用默认根。

如果您希望URI /project_1按预期工作,并且要转到项目的index.html文件的默认操作,请更改try_files指令。

location /project_1 {
    root /home/bundles/project_1;
    try_files $uri $uri/ /project_1/index.html;
}

有关详情,请参阅this document

由于两个项目共享一个公共根,因此可以简化如下:

server {
    listen 80;
    server_name projects.example.com;

    root /home/bundles
    index index.html;

    location /project_1 {
        try_files $uri $uri/ /project_1/index.html;
    }
    location /project_2 {
        try_files $uri $uri/ /project_2/index.html;
    }
    location / {
        deny all;
    }
}

我添加了index指令以避免依赖于默认值(相同),并添加location块以拒绝访问项目之外的区域。

答案 1 :(得分:0)

我遇到了同样的问题...对于我来说,原来的默认站点正在“超越”我想要的辅助站点并提供默认文件...那么它允许IP6请求和我的新站点没有。

这是我的access.log的示例:

::1 - - [05/Sep/2020:15:05:16 -0600] "GET / HTTP/1.1" 200 40 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36"

是否注意到::1位?我想我的浏览器默认是IP6请求。因此,我只是通过更改以下内容来确保在我的站点配置文件中启用有问题的站点的本地IP6请求:

listen 80;
server_name example.local;

收件人:

listen 80;
listen [::]:80;
server_name example.local;

就是这样。