引出问题
传统的web开发中,服务器或Nginx
通常会读取request.header
中x-forwarded-for
、x-real-ip
等字段作为客户端真实IP。
但在Nuxt3中,我们API服务器收到的请求分为2种,一种是由浏览器直接发起的客户端请求,另一种则是当服务器渲染是从ssr服务器
发往API服务器的服务端请求。
如果一个http请求是从ssr服务器
发往我们的api服务器
,我们的api服务器
默认是不能获取到用户客户端真实IP的,通常获取到的是ssr服务器主机IP。
这是因为Nuxt3的ssr
端是不会在header
中向API服务器
传递x-forwarded-for
、x-real-ip
这些字段,从而导致API服务器
获取不到客户端真实的ip
地址。
既然知道了原因,我们就可以在ssr
端通过手动设置header
来向我们的api服务器
传递ip信息解决这个问题。
useRequestHeaders
那么,如何在ssr端获取到客户端的真实IP呢?Nuxt3为我们提供了一个useRequestHeaders
的方法。通过这个api我们能够很方便的在ssr服务器
获取到request.header
,获取到header之后,我们只需要再将相关header字段转发给我们的api服务器
即可
文档地址:https://v3.nuxtjs.org/api/composables/use-request-headers
代码如下所示:
export const useMyFetch = (url, opt) => {
const accessToken = useCookie('accessToken')
let h = useRequestHeaders(['x-forwarded-for', 'x-real-ip', 'user-agent'])
let headers = {
"Authorization": "Bearer " + accessToken.value,
}
if (process.server) {
Object.assign(headers, h)
}
// console.log("headers", headers)
return useFetch(url,
{
headers: headers,
baseURL: process.env.NODE_ENV === 'production' ? 'https://api.xxx.com' : 'http://192.168.3.35:9900',
...opt
})
}