如何使用nginx为root提供静态html并代理其他所有内容?

时间:2016-11-25 03:35:13

标签: nginx nginx-location

此配置的目标是:

  1. 为主页提供简单的HTML以启动SPA,例如。 www.website.comwww.website.com/?foo=bar
  2. 代理到Python REST API,用于未被1捕获的所有内容,例如。 www.website.com/foowww.website.com/foo?bar=123
  3. html文件位于/var/www/website.com/index.html

    server {
        listen 80;
        server_name website.com;
        return 301 $scheme://www.website.com$request_uri;
    }
    
    server {
        listen 80;
        server_name www.website.com;
        access_log off;
    
        location = / {
            root /var/www/website.com;
        }
        location / {
            proxy_pass http://127.0.0.1:8000;
        }
    }
    

    我在Python端看到/index.html的请求而在那里失败了。如果我删除了location /,那么我会看到“欢迎使用nginx”页面,显然location = /无效。我做错了什么?

2 个答案:

答案 0 :(得分:2)

NGINX - Serving Static Content

  

如果请求以斜杠结尾,NGINX会将其视为对目录的请求,并尝试在目录中查找索引文件。 index指令定义索引文件的名称(默认值为index.html)。

检查您是否在当前或任何封闭范围内定义了index。如果是这样,它会在nginx中创建一个内部重定向,它将匹配Python位置(location /)。

在你的情况下,我认为至少有两种解决方案:

  1. 添加另一个与索引文件明确匹配的位置块:

    location = /index.html {
        ...
    }
    
  2. 在根位置使用try_files

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

答案 1 :(得分:1)

您可以使用error_page 404重定向流量。 "如果在内部重定向期间不需要更改URI和方法,则可以将错误处理传递到命名位置。"

另外,你有语法错误,这就是"欢迎"页面正在显示。

此解决方案在此处注明:http://nginx.org/en/docs/http/ngx_http_core_module.html#error_page

server {
    listen 80;
    server_name www.website.com;
    index index.html;
    root /var/www/www.website.com;

    error_page 404 = @fallback;

    location @fallback {
            proxy_pass http://127.0.0.1:8000;
    }

}