使用 http-proxy 代理 HTTP 请求时遇到的 the requested url is invalid 错误消息

简介: 使用 http-proxy 代理 HTTP 请求时遇到的 the requested url is invalid 错误消息

使用如下代码创建 HTTP 代理服务器


const http = require('http');
const httpProxy = require('http-proxy');
const targetUrl = 'https://www.sap.cn/index.html';
const proxy = httpProxy.createProxyServer({
    target: targetUrl,
    secure:false
});
http.createServer(function (req, res) {
    proxy.web(req, res);
}).listen(8089);
console.log('Proxy listens in 8089');


浏览器输入 http://localhost:8089/,遇到如下错误消息:


The requested URL “http://%5bNo%20Host%5d/index.html/”, is invalid.


在 proxy 服务器构造时,添加一行 changeOrigin:true, 后,错误消失:






这行代码的作用:


changeOrigin: true/false, Default: false - changes the origin of the host header to the target URL


意思是:置为 true,可以将 host header 的 origin 值,更改为目标 URL。


我们可以把 HTTP server 构造时指定的 target 字段,设置到 proxy.web 方法里,仍然工作:




第 15 行 web 方法的第三个参数,接收一个字段为 target 的 JSON 对象,值为期望跳转到的目标 url.


同第一种方法不同,大家注意到,这种方法,我们在地址栏里输入了 localhost:8089, 打开被代理的百度网页后,地址栏里的 localhost:8089 保持不变:




const http = require('http');
const httpProxy = require('http-proxy');
const targetUrl = 'https://www.sap.cn/index.html';
const baidu = 'https://www.baidu.com';
const proxy = httpProxy.createProxyServer({
    //target: targetUrl,
    changeOrigin:true,
    secure:false
});
http.createServer(function (req, res) {
    proxy.web(req, res, {
        target: baidu
    });
}).listen(8089);
console.log('Proxy listens in 8089');


但是对于 sap 官网来说,有一个重定向的行为:




Access to fetch at ‘https://wappass.baidu.com/static/captcha/tuxing.html?&logid=11334581951689513341&ak=c27bbc89afca0463650ac9bde68ebe06&backurl=https%3A%2F%2Fwww.baidu.com%2Fbaidu&signature=266d81f92ed0df604946084fd4d93f4c×tamp=1661502581’ (redirected from ‘http://localhost:8085/baidu’) from origin ‘http://localhost:8085’ has been blocked by CORS policy: The ‘Access-Control-Allow-Origin’ header has a value ‘http://wappass.baidu.com’ that is not equal to the supplied origin. Have the server send the header with a valid value, or, if an opaque response serves your needs, set the request’s mode to ‘no-cors’ to fetch the resource with CORS disabled.



正常情况下,使用 fetch 请求绝对路径:



在 Chrome 开发者工具 network 标签页里,没有观察到 OPTIONS 请求:



直接就是 HTTP GET CORS 错误了。当站点 A 尝试从站点 B 获取内容时,站点 B 可以发送一个 Access-Control-Allow-Origin 响应标头,告诉浏览器该页面的内容可以从某些来源访问。 源是一个域(domain),加上一个方案(scheme)和端口号。


相关文章
|
4天前
|
数据采集 前端开发 安全
socks5代理是什么意思?它跟http代理有什么不同点?它有什么应用场景?
**SOCKS5**是一种代理协议,位于会话层,作为前端与服务器间的中介,确保通信安全。与**HTTP代理**不同,SOCKS5不处理应用层协议,提供更快的速度,且适用范围更广,不仅限于HTTP。主要应用场景包括数据采集和电子商务。选择使用取决于具体业务需求。
|
4天前
|
缓存 监控 安全
HTTP代理,什么是HTTP代理?HTTP代理如何设置?HTTP代理的用途?
HTTP代理用于访问封锁网站、加速访问、提升安全,国内常用于网络加速。HTTP代理插件提供隐私保护、解除网站限制、增强安全及定制浏览体验。设置代理通常在操作系统网络设置或浏览器选项中进行,输入代理服务器地址和端口。
|
1天前
|
JSON 编解码 Go
Golang深入浅出之-HTTP客户端编程:使用net/http包发起请求
【4月更文挑战第25天】Go语言`net/http`包提供HTTP客户端和服务器功能,简化高性能网络应用开发。本文探讨如何发起HTTP请求,常见问题及解决策略。示例展示GET和POST请求的实现。注意响应体关闭、错误处理、内容类型设置、超时管理和并发控制。最佳实践包括重用`http.Client`,使用`context.Context`,处理JSON以及记录错误日志。通过实践这些技巧,提升HTTP编程技能。
15 1
|
2天前
|
网络协议 安全 数据安全/隐私保护
Socks5代理和HTTP代理的区别在哪里?
Socks5和HTTP代理是两种IP代理方式,分别基于Socks5及HTTP协议。Socks5支持TCP/UDP,适合P2P、游戏和流媒体,提供传输层身份验证。HTTP代理仅支持HTTP,适用于Web浏览控制和内容过滤。选择代理应根据实际需求,如需高速低延迟选Socks5,需访问控制选HTTP。
|
2天前
|
网络协议 数据安全/隐私保护
Socks5代理和HTTP代理有哪些优缺点?
SOCKS5和HTTP代理对比:SOCKS5支持TCP/UDP,提供身份验证和数据加密,性能优但无法处理HTTP头部信息;HTTP代理能读取头部做细粒度控制,广泛支持但仅限HTTP协议,可能影响性能。选择取决于具体需求和应用支持。
|
2天前
|
前端开发 API UED
AngularJS的$http服务:深入解析与进行HTTP请求的技术实践
【4月更文挑战第28天】AngularJS的$http服务是核心组件,用于发起HTTP请求与服务器通信。$http服务简化了通信过程,通过深入理解和实践,能构建高效、可靠的前端应用。
|
3天前
|
Go 开发者
Golang深入浅出之-HTTP客户端编程:使用net/http包发起请求
【4月更文挑战第24天】Go语言的`net/http`包在HTTP客户端编程中扮演重要角色,但使用时需注意几个常见问题:1) 检查HTTP状态码以确保请求成功;2) 记得关闭响应体以防止资源泄漏;3) 设置超时限制,避免长时间等待;4) 根据需求处理重定向。理解这些细节能提升HTTP客户端编程的效率和质量。
14 1
|
4天前
|
安全 网络协议 网络安全
Socks5代理与HTTP代理的区别与优劣
在互联网时代,隐私和安全至关重要,代理服务器如socks5和HTTP代理成为保护个人信息的工具。socks5代理支持多种网络流量和UDP协议,更具灵活性和通用性,但设置复杂;HTTP代理则更常见、易用,适合仅处理HTTP流量的场景,但限制较多。选择哪种代理取决于具体需求和应用场景。
|
4天前
|
网络安全
socks5代理连接成功无法访问http协议的站点
无法通过SOCKS5代理访问HTTP网站可能由多个原因引起,如代理服务器不支持HTTP、配置错误、防火墙阻拦、连接问题、身份验证失败、浏览器设置不当或服务器被封锁。检查并解决这些因素,若问题持续,需深入排查或联系服务提供商。
|
4天前
|
存储 缓存 开发框架
Flutter的网络请求:使用Dart进行HTTP请求的技术详解
【4月更文挑战第26天】了解Flutter网络请求,本文详述使用Dart进行HTTP请求