编写HTTP客户端时,访问本地服务器与Web服务器的请求差异原因咨询
关于HTTP客户端本地与远程请求差异的疑问解答
问题描述
我是Socket编程新手,目前正在开发一款HTTP客户端。我对访问本地文件夹和Web服务器上的文件夹存在困惑:
- 当文件放在本地文件夹中,对应URL为
http://localhost:8000/1/example.html时,必须将GET请求的路径设为/example.html,Host头设为localhost/1才能正常工作,请求内容如下:
GET /example.html HTTP/1.0 Host:localhost/1
- 但访问远程Web服务器(比如
http://info.cern.ch/hypertext/WWW/TheProject.html)时,Host头需设为info.cern.ch,路径设为/hypertext/WWW/TheProject.html,请求内容如下:
GET /hypertext/WWW/TheProject.html HTTP/1.0 Host:info.cern.ch
想了解造成这种差异的原因是什么?是不是URL中的目录与本地文件夹的工作方式不同?
原因解析
核心问题:本地服务器不符合HTTP标准
HTTP协议明确规定,Host头的作用是指定目标服务器的域名(或IP+端口),绝对不能包含路径部分。正规Web服务器都会严格遵循这个规则解析请求:
Host头仅用于确定要访问的服务器实例(比如一台服务器托管多个域名时,靠它区分站点)- GET请求后的路径才是服务器上资源的位置标识
你遇到的本地异常情况,大概率是使用的本地服务器(比如自制的简易服务或某些非标准工具)配置错误——它错误地将Host头里的路径后缀当成了资源的根目录,而非按标准解析GET请求中的路径。
URL与本地文件夹的逻辑差异
标准HTTP URL的结构是协议://主机名:端口/路径,各部分职责清晰:
主机名(如localhost、info.cern.ch)是服务器的网络标识,和本地文件夹层级无关路径才对应服务器文件系统中的文件夹/文件位置(服务器可通过配置做路径映射,不一定完全对应物理路径)
你本地的服务器相当于搞反了逻辑,把Host头的后缀当作根目录,所以才需要把本该放在路径里的/1挪到Host中才能访问文件。这不是HTTP的标准行为,换用标准本地服务器(比如Python自带的python -m http.server),用以下标准请求格式就能正常访问:
GET /1/example.html HTTP/1.0 Host:localhost:8000
内容的提问来源于stack exchange,提问作者Molecular Car
相关产品推荐
相关产品推荐

