前后端分离原因,这里就不展开讨论了,大家可以去了解下相关技术文章。
需求背景:
- 前后端分离。
- 利用 cookies 记住会话。
具体实践:
路由设计:
用户直接访问的页面,全部由前端框架来 routing, 所有 API 请求以 /api
开头, 并被 nginx 代理到后端应用里 。
为什么要这么设计?
因为我们需要利用 cookies 来记录会话,但是 cookies 有同域保护的问题(子域名也不行), 那么用户访问地址和 API 请求必须具有相同的域名。
API 的请求全部拥有统一的前缀,只是为了方便 nginx 作代理请求。
代码如下:
location /api {
expires -1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_redirect off;
proxy_pass http://localhost:9090; // Application location
break;
}
前端处理 404 问题:
默认前端只有 index.html
页面, 那么当用户访问 example.com/index2.html
的时候,
如果不做特殊处理,将得到一个默认的 404 页面。
但是很有可能,在经过前端 js routing 过后,发现 index2.html
页面是存在的。
所以判断页面存在与否,取决于前端代码 routing 匹配过后结果,显然无论用户访问怎样的路由,
我们都应该先返回 index.html
,然后执行前端代码,根据访问的路由来确定展现页面。
这里我们可以偷个懒,直接使用 nginx 的 error_page, 将其指向 index 页面即:
error_page 404 /index.html
开发模式下,解决同域的问题:
由于开发也是前后端分离的,前端人员开发不依赖 nginx, 那么可以找个能够修改域的中间件来解决这问题,
例如我们使用了 http-proxy-middleware
。
结论:
想要拥有前后端分离的好处,又想使用 cookies 记录会话,不妨采用这种方式,只需简单修改 nginx 即可,侵入极小。