仅支持HTTP的代理发CONNECT+GET请求HTTPS返回200而非403的原因
原因说明
你观测到的「CONNECT+GET请求返回200」并非成功通过代理访问了目标HTTPS站点,本质是作为测试节点的PROXYHOST自身返回的响应,具体逻辑如下:
- 你的PROXYHOST本质是未部署代理服务的普通Apache Web服务器,本身不支持HTTP代理的CONNECT隧道功能。默认配置下收到CONNECT请求时会直接返回403 Forbidden,这也是你用curl、requests发起标准HTTPS代理请求失败的原因:标准客户端会先发送
CONNECT example.com:443请求建立到目标站点的隧道,直接被PROXYHOST拒绝。 - 你构造的「CONNECT+GET」属于不符合代理规范的错误请求,触发了服务器的容错逻辑:你发送的第一行CONNECT请求的目标是PROXYHOST自身,而非要访问的example.com;Apache收到不识别的CONNECT方法后,会直接跳过非法请求行,处理后续紧跟的GET请求。
- 你发送的GET请求
GET https://www.example.com:443 HTTP/1.0对于普通Web服务器来说,会自动忽略路径中的协议、域名部分,仅提取路径段匹配自身站点资源。该请求等效于请求PROXYHOST的根路径/,根路径存在的情况下自然返回200状态码,且响应体为PROXYHOST自身的HTML内容,和你附加信息中描述的特征完全吻合。
你可以自行验证该结论:查看该200响应的响应体内容,必然和你直接访问PROXYHOST的8080端口返回的内容完全一致,和example.com无关。
内容的提问来源于stack exchange,提问作者Martin Kroll
相关产品推荐
相关产品推荐

