参考官网配置,在nuxt.config.ts中添加字段如下
nitro: {
devProxy: {
"/api-remote": {
target: "https://api.nnnnzs.cn",
changeOrigin: true,
prependPath: true
}
}
},
此时,如本地开发环境起的服务端口为4000
,则请求http://localhost:4000/api-remote/someApi
的请求,会被nuxt的代理转发到 https://api.nnnnzs.cn/someApi
一般情况下,前端项目起一个单独的nginx server,可以理解为vhost,在部署前端的服务器上生成配置
server {
listen 80 default_server;
server_name www.nnnnzs.cn
location /api-remote/ {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://api.nnnnzs.cn;
}
location / {
proxy_pass http://127.0.0.1:4000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
}
}
假设在部署服务器上npm run start
的端口也是4000,配置location
代理,通过外网访问代理到代理服务器的请求http://www.nnnnzs.cn/api-remote/someApi
会被代理到https://api.nnnnzs.cn/someApi
服务端渲染期间(在server/api目录内发起的http请求同理)本质是nuxt的服务端,发起的http请求,如果在此期间请求外部接口,如果使用相对路径,则无法使用nitro的代理服务
// 不经过nitro代理
export default defineEventHandler(async (event) => {
return await $fetch('/api-remote/someApi', {
method: 'GET',
});
})
// 经过使用代理
export default defineEventHandler(async (event) => {
return await $fetch('http://localhost:4000/api-remote/someApi', {
method: 'GET',
});
})
useAsyncData 会阻塞页面渲染,拿到数据之后,再进行mounted
,所以没不经过代理,但是如果加上协议域名变成绝对路径,就可以走代理
// 不经过 nitro 代理
const fetchPost = () =>
$fetch(`/api-remote/someApi`)
const { data } = await useAsyncData("post", fetchPost)
// 经过nitro 代理
const fetchPost = () =>
$fetch(`http://localhost:4000/api-remote/someApi`)
const { data } = await useAsyncData("post", fetchPost)
// 浏览器发起 经过nginx代理
onMounted(()=>{
$fetch(`/api-remote/someApi`)
})
我曾经用nestjs写过服务端接口,正常调用。
后来在知道Nuxtjs server/api/ 也可以写接口后,使用page->server/api->http请求到nestjs的接口。饶了一大圈发现相对路径和绝对路径代理的问题,特此记录。
不要 为赋新词强说愁