2017-08-04 28 views
2

我将NGINX设置为一个将Docker容器作为容器运行的虚拟网络的反向代理。其中一个容器为基于Angular 4的SPA提供HTML5模式下的客户端路由。HTML5模式中的NGINX,proxy_pass和SPA路由

该应用程序被映射到NGINX上的位置,以便http://server/带您进入SPA主屏幕。水疗中心内航行时

server { 
    listen 80; 

    ... 

    location/{ 
     proxy_pass http://spa-server/; 
    } 

    location /other/ { 
     proxy_pass http://other/; 
    } 

    ... 
} 

的角度路由器改变URL来http://server/home或其它途径。

但是,当我尝试直接访问这些URL时,会返回404。该错误源于spa-server,因为它显然没有任何这些路由的内容。

我发现配置NGINX以支持这种情况的例子总是假设SPA的静态内容直接从NGINX提供,因此try_files是一个可行的选择。

如何将任何未知的URL转发到SPA以便它可以处理它们本身?

回答

4

这对我的作品是将指令proxy_intercept_errorserror_page添加到location /在NGINX解决办法:

server { 
    listen 80; 

    ... 

    location/{ 
     proxy_pass http://spa-server/; 
     proxy_intercept_errors on; 
     error_page 404 /index.html; 
    } 

    location /other/ { 
     proxy_pass http://other/; 
    } 

    ... 
} 

现在,NGINX将从spa-server返回/index.html即SPA每当一个未知请求URL。不过,该URL可供Angular使用,路由器将立即在SPA内解决该问题。

当然,SPA现在负责处理“真实”404s。幸运的是,无论如何,这在SPA中并不是一个问题和好的做法。