PHP教程:HTTP1.0协议下HTTP_HOST为空的根本原因
2012-05-17 08:39
417 查看
昨天xuepeng师兄提出一个问题是PHP在获取 $_SERVER['HTTP_HOST']为空,经过我翻看RFC文档以及测试,得出结论如下:
在http 1.1中,host字段是不能为空的,如果为空,服务器会认为是bad request
但是在http 1.0中,host字段是可以为空的. 如:
其中,主机的index.php只是var_dump($_SERVER['HTTP_HOST']);
可以看到,当你指明使用http 1.0协议的时候,请求正常,返回结果是false;
但是如果你指明协议是http 1.1 :
则结果是400 bad request;
究其原因是因为在HTTP1.0的时候,并没有设想到现在有这么多服务器共用一个IP的情况(virtual host),而在HTTP1.1的时候,加入了对多个HOST共用一个IP的支持.
以下文字摘自RFC2616:
14.23 Host
The Host request-header field specifies the Internet host and port
number of the resource being requested,as obtained from the original
URI given by the user or referring resource (generally an HTTP URL,Fielding,et al. Standards Track [Page 128]
RFC 2616 HTTP/1.1 June 1999
as described in section 3.2.2). The Host field value MUST represent
the naming authority of the origin server or gateway given by the
original URL. This allows the origin server or gateway to
differentiate between internally-ambiguous URLs,such as the root “/”
URL of a server for multiple host names on a single IP address.
Host =“Host” “:” host [ ":" port ] ; Section 3.2.2
A “host” without any trailing port information implies the default
port for the service requested (e.g.,“80″ for an HTTP URL). For
example,a request on the origin server for
would properly include:
GET /pub/WWW/ HTTP/1.1
Host: www.w3.org
A client MUST include a Host header field in all HTTP/1.1 request
messages . If the requested URI does not include an Internet host
name for the service being requested,then the Host header field MUST
be given with an empty value. An HTTP/1.1 proxy MUST ensure that any
request message it forwards does contain an appropriate Host header
field that identifies the service being requested by the proxy. All
Internet-based HTTP/1.1 servers MUST respond with a 400 (Bad Request)
status code to any HTTP/1.1 request message which lacks a Host header
field.
以下省略…..
后记: 虽然HTTP_HOST不能缺失,但是可以为空值 (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.23):
If the requested URI does not include an Internet host name for the service being requested,then the Host header field MUST be given with an empty value.
作者: Laruence
原文链接:http://www.laruence.com/2008/08/28/483.html
在http 1.1中,host字段是不能为空的,如果为空,服务器会认为是bad request
但是在http 1.0中,host字段是可以为空的. 如:
1 | <?php |
2 | $fp = fsockopen ( "localhost" ,80, $errno , $errstr ,30); |
3 |
4 | $header = "GET /index.php" ; |
5 | $header .= " HTTP/1.0\r\n" ; |
6 |
7 | $header .= "Connection:Close\r\n\r\n" ; |
8 | fwrite( $fp , $header ); |
9 | echo fread ( $fp ,1024); |
10 | fclose( $fp ); |
11 | ?> |
可以看到,当你指明使用http 1.0协议的时候,请求正常,返回结果是false;
但是如果你指明协议是http 1.1 :
1 | <?php |
2 | $fp = fsockopen ( "localhost" ,80, $errno , $errstr ,30); |
3 |
4 | $header = "GET /index.php" ; |
5 | $header .= " HTTP/1.1\r\n" ; |
6 |
7 | $header .= "Connection:Close\r\n\r\n" ; |
8 | fwrite( $fp , $header ); |
9 | echo fread ( $fp ,1024); |
10 | fclose( $fp ); |
11 | ?> |
究其原因是因为在HTTP1.0的时候,并没有设想到现在有这么多服务器共用一个IP的情况(virtual host),而在HTTP1.1的时候,加入了对多个HOST共用一个IP的支持.
以下文字摘自RFC2616:
14.23 Host
The Host request-header field specifies the Internet host and port
number of the resource being requested,as obtained from the original
URI given by the user or referring resource (generally an HTTP URL,Fielding,et al. Standards Track [Page 128]
RFC 2616 HTTP/1.1 June 1999
as described in section 3.2.2). The Host field value MUST represent
the naming authority of the origin server or gateway given by the
original URL. This allows the origin server or gateway to
differentiate between internally-ambiguous URLs,such as the root “/”
URL of a server for multiple host names on a single IP address.
Host =“Host” “:” host [ ":" port ] ; Section 3.2.2
A “host” without any trailing port information implies the default
port for the service requested (e.g.,“80″ for an HTTP URL). For
example,a request on the origin server for
would properly include:
GET /pub/WWW/ HTTP/1.1
Host: www.w3.org
A client MUST include a Host header field in all HTTP/1.1 request
messages . If the requested URI does not include an Internet host
name for the service being requested,then the Host header field MUST
be given with an empty value. An HTTP/1.1 proxy MUST ensure that any
request message it forwards does contain an appropriate Host header
field that identifies the service being requested by the proxy. All
Internet-based HTTP/1.1 servers MUST respond with a 400 (Bad Request)
status code to any HTTP/1.1 request message which lacks a Host header
field.
以下省略…..
后记: 虽然HTTP_HOST不能缺失,但是可以为空值 (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.23):
If the requested URI does not include an Internet host name for the service being requested,then the Host header field MUST be given with an empty value.
作者: Laruence
原文链接:http://www.laruence.com/2008/08/28/483.html
相关文章推荐
- PHP教程:HTTP1.0协议下HTTP_HOST为空的根本原因
- 教程4:get,post方法与Http协议
- [李景山php]HTTP/2.0 相比1.0有哪些重大改进
- HTTPSQS:基于HTTP协议的轻量级开源简单队列服务(安装php客户端)
- PHP中 HTTP_HOST 和 SERVER_NAME 的区别
- Wb开发基础-Http1.0协议-客户端与服务器端的交互
- quick-cocos2d-x教程11:实现http通信,并与网站php对接,可实现登录等常见功能
- PHP - Manual手册 - Appendices附录 - List of Supported Protocols/Wrappers支持的协议/封装协议列表 - HTTP and HTTPS
- PHP HTTP协议(报头/状态码/缓存)
- http协议不同版本之间的对比(1.0 1.1 2.0)
- php $_SERVER中的SERVER_NAME 和HTTP_HOST的区别
- php 利用http上传协议(表单提交上传图片 )
- php--------http状态代码及其原因
- http协议分析软件-Fiddler 教程
- PHP中Http协议post请求参数
- PHP $_SERVER['HTTP_HOST']与$_SERVER["SERVER_NAME"]的区别
- PHP自动获取协议http还是https
- php $_SERVER中的SERVER_NAME 和HTTP_HOST的区别
- 应用程序的退出 (转自教程)http://www.vczx.com/tutorial/mfc/mfc.php
- PHP HTTP协议:防盗链