Índice
1. Código de proxy reverso (problemático)
接口封装
export function GetCardNum() {
return request({
url: '/mon_archive_cabinet_RFID/api/GetCardNum'
})
}
代理配置
// webpack-dev-server 相关配置
devServer: {
host: '0.0.0.0',
port: 8080,
https: false,
hotOnly: false,
open: true, // 自动打开浏览器
proxy: {
// ...
'/api': {
ws: false, // proxy websockets
target: 'http://192.168.0.42:9151',
pathRewrite: {
'^/api': '' },
},
// ...
'/mon_archive_cabinet': {
target: 'http://192.168.0.26:9577',
},
'/mon_archive_cabinet_RFID': {
// 【主要代码】代理代码
target: 'http://localhost:5001',
pathRewrite: {
'^/mon_archive_cabinet_RFID': '' }
},
'/': {
target: 'http://192.168.0.42:9000'
}
}
},
pergunta
Interface 404
2. Razões para solução de problemas
[Etapas de solução de problemas]
- Pense nisso : precisamos primeiro ver
反向代理的真实地址
onde está o endereço de solicitação da interface e depois ver se é um problema de proxy ou outros problemas;- Visualização de endereço real
logLevel: 'debug'
: Adicione a configuração na configuração do proxy , e você pode imprimir o endereço proxy do endereço solicitado no terminal, mas adicioná-lo é inútil, o terminal não produz nada;- 2 Se não funcionar, encontre outras maneiras de verificar o endereço real do proxy:
onProxyRes
Adicione a configuração do proxy ao cabeçalho da solicitação em Configuraçãox-real-url1
para exibir o endereço real da solicitação;
- O endereço proxy encontrado é
/api
o endereço proxy dehttp://192.168.0.42:9151
[Pergunta 1]- [Solução para o Problema 1] Modifique
/api
o agente para^/api
(veja a explicação do Problema 1 abaixo para saber o motivo da modificação)- Verificou-se que o endereço do agente mudou
/mon_archive_cabinet
novamente para o endereço do agente [Questão 2]
- [Solução para o problema 2] Modifique o prefixo do endereço de solicitação de interface
/mon_archive_cabinet_RFID
para/RFID
(ou seja, modifique o endereço de solicitação de interface/mon_archive_cabinet_RFID/api/GetCardNum
para/RFID/api/GetCardNum
) e modifique o proxy reverso/mon_archive_cabinet_RFID
para/RFID
(para saber o motivo da modificação, consulte a explicação do Problema 2 abaixo)- Verificação [Problema 2 resolvido]
【Pergunta 1】 Causa
/api
O significado de proxy é: desde que o endereço da solicitação contenha/api
, este proxy será usado, e outros proxies abaixo deste proxy não serão usados; o
^/api
significado de proxy é: apenas o endereço de solicitação/api
que começa com será correspondido e o resto não corresponderá
[então] modifique/api
o proxy para^/api
【Pergunta 2】 Causa
Sequenciar problemas e resolver problemas iniciais
/mon_archive_cabinet
Proxy : O endereço da solicitação que queremos usar/mon_archive_cabinet_RFID/api/GetCardNum
contém o proxy && O início do endereço da solicitação é consistente com o proxy (correspondência difusa)&& O proxy está/mon_archive_cabinet_RFID
antes do código do proxy , portanto, o proxy é correspondido e não continua a corresponder ao proxy após o código proxy/mon_archive_cabinet_RFID
[
Solução] 2 maneiras
- Coloque
/mon_archive_cabinet_RFID
o código do agente/mon_archive_cabinet
antes do código do agente;- Modifique
/mon_archive_cabinet_RFID
o nome do proxy e o endereço inicial do endereço da solicitação (a solução que usei).
[Anexo: código de solução de problemas]
代理配置 - 排查问题原因
devServer: {
host: '0.0.0.0',
port: 8080,
https: false,
hotOnly: false,
open: true, // 自动打开浏览器
proxy: {
// ...
// '/api': {
'^/api': {
ws: false, // proxy websockets
target: 'http://192.168.0.42:9151',
pathRewrite: {
'^/api': '' },
changeOrigin: true,
logLevel: 'debug', // 该代码可在控制台输出代理的真实地址 - 但是我的就没有
onProxyRes(proxyRes, req, res) {
console.log('req.url----api----', req.url) // 会在终端打印出当前请求地址 - 不加域名的请求地址
// 增加代理的真实地址
const realUrl = new URL(req.url || '', 'http://192.168.0.42:9151' || '')
proxyRes.headers['x-real-url1'] = realUrl // 在请求头添加 x-real-url1 字段,展示实际请求的地址 - 代理之后地址
}
},
// ...
'/mon_archive_cabinet': {
target: 'http://192.168.0.26:9577',
changeOrigin: true,
logLevel: 'debug', // 该代码可在控制台输出代理的真实地址 - 但是我的就没有
onProxyRes(proxyRes, req, res) {
console.log('req.url----mon_archive_cabinet----', req.url) // 会在终端打印出当前请求地址 - 不加域名的请求地址
// 增加代理的真实地址
const realUrl = new URL(req.url || '', 'http://192.168.0.26:9577' || '')
proxyRes.headers['x-real-url1'] = realUrl // 在请求头添加 x-real-url1 字段,展示实际请求的地址 - 代理之后地址
}
},
// '/mon_archive_cabinet_RFID': { // 会和 /mon_archive_cabinet 代理冲突
'^/RFID': {
target: 'http://localhost:5001',
changeOrigin: true,
logLevel: 'debug', // 该代码可在控制台输出代理的真实地址 - 但是我的就没有
onProxyRes(proxyRes, req, res) {
console.log('req.url---RFID-----', req.url) // 会在终端打印出当前请求地址 - 不加域名的请求地址
// 增加代理的真实地址
const realUrl = new URL(req.url || '', 'http://localhost:5001' || '')
proxyRes.headers['x-real-url1'] = realUrl // 在请求头添加 x-real-url1 字段,展示实际请求的地址 - 代理之后地址
},
// pathRewrite: { '^/mon_archive_cabinet_RFID': '' }
pathRewrite: {
'^/RFID': '' } // 实际请求中请求地址不会加 /RFID
},
'/': {
target: 'http://192.168.0.42:9000'
}
}
},
3. Resumo – resolvendo o código
接口封装
export function GetCardNum() {
return request({
// url: 'http://192.168.10.106:5001/api/GetCardNum' // 本地ip
// url: 'http://localhost:5001/api/GetCardNum' // 测试接口时接口地址
// url: '/mon_archive_cabinet_RFID/api/GetCardNum' // 接口地址添加反向代理地址头(不用 - 因为会和 /mon_archive_cabinet 代理冲突)
url: '/RFID/api/GetCardNum' // 接口地址添加反向代理地址头
// url: '/mon_archive_cabinet/api/GetCardNum' // 排查问题时借用 /mon_archive_cabinet 地址头
})
}
代理配置
devServer: {
host: '0.0.0.0',
port: 8080,
https: false,
hotOnly: false,
open: true, // 自动打开浏览器
proxy: {
// ...
'^/api': {
// 【解决问题主要代码】添加 ^ 表示以 /api 开头的地址代理到此处;不加 ^ 则只要地址里有 /api 就可代理此处,代理此处后则此处以下的代码将不会被代理到
ws: false, // proxy websockets
target: 'http://192.168.0.42:9151',
pathRewrite: {
'^/api': '' },
},
// ...
'/mon_archive_cabinet': {
target: 'http://192.168.0.26:9577',
},
// '/mon_archive_cabinet_RFID': { // 会和 /mon_archive_cabinet 代理冲突,所以不用
'^/RFID': {
target: 'http://localhost:5001',
// changeOrigin: true, // 默认是 true
// pathRewrite: { '^/mon_archive_cabinet_RFID': '' }
pathRewrite: {
'^/RFID': '' }
},
'/': {
target: 'http://192.168.0.42:9000'
}
}
},
4. Resumo – proxy reverso
- Quando existem vários endereços proxy:
- Preste atenção se começa com determinados endereços ou contém determinados endereços;
- Observe que a correspondência difusa não é uma correspondência exata entre / e / no endereço correspondente;
- Preste atenção na ordem dos endereços de proxy para evitar que o proxy escrito no final seja priorizado pelo proxy escrito no início, causando falha na solicitação.
[Nota] Proxy reverso local e proxy reverso online
vue.config.js
O proxy reverso configurado no projeto vue front-end é útil apenas para o projeto em execução local front-end. Após a implantação online, o proxy reverso usanginx
o proxy configurado no back-end.
vue.config.js
Após configurarproxy
a execução entre domínios nonpm run build
, se o pacote for implantado no servidor, será relatado um problema entre domínios ou solicitação de interface 404. Por que o erro foi relatado?
- Porque após a compilação e o empacotamento, a página front-end se torna um recurso estático separado e o servidor proxy
devServer.proxy
é extraído.- Em outras palavras,
devServer.proxy
ele não será empacotado na pasta dist junto , então é equivalente a não configurarmos um servidor proxy! !- Como resolver isso? Para que um recurso seja acessado, deve haver um servidor proxy para carregá-lo.
- A maneira mais comum de implantar e ficar online é usar
nginx
proxy reverso. Você só precisa modificarnginx
o arquivo de configuração .- fonte