Nuxt3开发笔记

SSR获取客户端IP

Preview
  • 引出问题
  • useRequestHeaders

引出问题

传统的web开发中,服务器或Nginx通常会读取request.headerx-forwarded-forx-real-ip等字段作为客户端真实IP。

但在Nuxt3中,我们API服务器收到的请求分为2种,一种是由浏览器直接发起的客户端请求,另一种则是当服务器渲染是从ssr服务器发往API服务器的服务端请求。

如果一个http请求是从ssr服务器发往我们的api服务器,我们的api服务器默认是不能获取到用户客户端真实IP的,通常获取到的是ssr服务器主机IP。

这是因为Nuxt3的ssr端是不会在header中向API服务器传递x-forwarded-forx-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
        })
}

参考: https://github.com/nuxt/framework/discussions/4493