<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >HTTP 和 HTTPS</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK REL="HOME" TITLE="PHP 手册" HREF="index.html"><LINK REL="UP" TITLE="支持的协议/封装协议列表" HREF="wrappers.html"><LINK REL="PREVIOUS" TITLE="Socket" HREF="wrappers.socket.html"><LINK REL="NEXT" TITLE="FTP 和 FTPS" HREF="wrappers.ftp.html"><META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"></HEAD ><BODY CLASS="section" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#840084" ALINK="#0000FF" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="3" ALIGN="center" >PHP 手册</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="bottom" ><A HREF="wrappers.socket.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" >附录 N. 支持的协议/封装协议列表</TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="wrappers.ftp.html" ACCESSKEY="N" >下一页</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="section" ><H1 CLASS="section" ><A NAME="wrappers.http" >HTTP 和 HTTPS</A ></H1 ><P >PHP 3, PHP 4, PHP 5。自 PHP 4.3.0 起支持 <TT CLASS="filename" >https://</TT ></P ><P ></P ><UL ><LI ><P ><TT CLASS="filename" >http://example.com</TT ></P ></LI ><LI ><P ><TT CLASS="filename" >http://example.com/file.php?var1=val1&var2=val2</TT ></P ></LI ><LI ><P ><TT CLASS="filename" >http://user:password@example.com</TT ></P ></LI ><LI ><P ><TT CLASS="filename" >https://example.com</TT ></P ></LI ><LI ><P ><TT CLASS="filename" >https://example.com/file.php?var1=val1&var2=val2</TT ></P ></LI ><LI ><P ><TT CLASS="filename" >https://user:password@example.com</TT ></P ></LI ></UL ><P > 允许通过 HTTP 1.0 使用 HTTP GET 方法对文件/资源进行只读访问。<TT CLASS="literal" >Host:</TT > 报头也会通过请求发送出去以支持基于域名的虚拟主机。如果在 ini 文件或者流上下文配置了 <A HREF="ref.filesystem.html#ini.user-agent" >user_agent</A > 字符串,也会被包括在请求报头中。 </P ><DIV CLASS="warning" ><P ></P ><TABLE CLASS="warning" BORDER="1" WIDTH="100%" ><TR ><TD ALIGN="CENTER" ><B >警告</B ></TD ></TR ><TR ><TD ALIGN="LEFT" ><P >当使用 SSL 时,Microsoft IIS 将违反协议不发送 close_notify 标记就关闭连接。PHP 将在到达数据尾端时报告 "SSL: Fatal Protocol Error"。要绕过此问题,应将 <A HREF="ref.errorfunc.html#ini.error-reporting" >error_reporting</A > 级别降低为不包括警告。PHP 4.3.7 及更高版本可以在当使用 https:// 封装协议打开流的时候检测出有此问题的 IIS 服务器并抑制警告。如果使用 <A HREF="function.fsockopen.html" ><B CLASS="function" >fsockopen()</B ></A > 来创建一个 ssl:// 套接字,则需要自己检测并抑制警告信息。</P ></TD ></TR ></TABLE ></DIV ><P > 自 PHP 4.0.5 起支持重定向。如果使用较早版本的 PHP 则需要在 URL 末尾包括一个斜线。如果一定要知道文档所在的资源的 url(在所有重定向被处理过之后),则需要处理从流返回的一系列响应报头信息。 </P ><DIV CLASS="informalexample" ><P ></P ><A NAME="AEN302674" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />$url </font><font color="#007700">= </font><font color="#DD0000">'http://www.example.com/redirecting_page.php'</font><font color="#007700">;<br /><br /></font><font color="#0000BB">$fp </font><font color="#007700">= </font><font color="#0000BB">fopen</font><font color="#007700">(</font><font color="#0000BB">$url</font><font color="#007700">, </font><font color="#DD0000">'r'</font><font color="#007700">);<br /><br /></font><font color="#FF8000">/* 在 PHP 4.3.0 之前使用 $http_response_header<br /> 而不是 stream_get_meta_data() */<br /></font><font color="#0000BB">$meta_data </font><font color="#007700">= </font><font color="#0000BB">stream_get_meta_data</font><font color="#007700">(</font><font color="#0000BB">$fp</font><font color="#007700">);<br />foreach(</font><font color="#0000BB">$meta_data</font><font color="#007700">[</font><font color="#DD0000">'wrapper_data'</font><font color="#007700">] as </font><font color="#0000BB">$response</font><font color="#007700">) {<br /><br /> </font><font color="#FF8000">/* 重定向到何处? */<br /> </font><font color="#007700">if (</font><font color="#0000BB">substr</font><font color="#007700">(</font><font color="#0000BB">strtolower</font><font color="#007700">(</font><font color="#0000BB">$response</font><font color="#007700">), </font><font color="#0000BB">0</font><font color="#007700">, </font><font color="#0000BB">18</font><font color="#007700">) == </font><font color="#DD0000">'content-location: '</font><font color="#007700">) {<br /> </font><font color="#FF8000">/* 把要重定向的链接赋值给 $url */<br /> </font><font color="#0000BB">$url </font><font color="#007700">= </font><font color="#0000BB">substr</font><font color="#007700">(</font><font color="#0000BB">$response</font><font color="#007700">, </font><font color="#0000BB">18</font><font color="#007700">);<br /> }<br />}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV ><P > 流允许访问资源的<SPAN CLASS="emphasis" ><I CLASS="emphasis" >正文</I ></SPAN >,报头部分保存在 <CODE CLASS="varname" >$http_response_header</CODE > 变量中。自 PHP 4.3.0 起,可以用 <A HREF="function.stream-get-meta-data.html" ><B CLASS="function" >stream_get_meta_data()</B ></A > 得到报头。 </P ><P > HTTP 连接是只读的,不能将数据写入或者拷贝文件到 HTTP 资源。 </P ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >注意: </B > 自 PHP 4.3.0 起开始支持 HTTPS,需要在编译时加入 OpenSSL 的支持。 </P ></BLOCKQUOTE ></DIV ><P > <DIV CLASS="table" ><A NAME="AEN302684" ></A ><P ><B >表 N-2. Wrapper Summary</B ></P ><TABLE BORDER="1" CLASS="CALSTABLE" ><COL><COL><THEAD ><TR ><TH >属性</TH ><TH >支持</TH ></TR ></THEAD ><TBODY ><TR ><TD >受限于 <A HREF="ref.filesystem.html#ini.allow-url-fopen" >allow_url_fopen</A ></TD ><TD >是</TD ></TR ><TR ><TD >允许读取</TD ><TD >是</TD ></TR ><TR ><TD >允许写入</TD ><TD >否</TD ></TR ><TR ><TD >允许附加</TD ><TD >否</TD ></TR ><TR ><TD >允许同时读写</TD ><TD >无效</TD ></TR ><TR ><TD >支持 <A HREF="function.stat.html" ><B CLASS="function" >stat()</B ></A ></TD ><TD >否</TD ></TR ><TR ><TD >支持 <A HREF="function.unlink.html" ><B CLASS="function" >unlink()</B ></A ></TD ><TD >否</TD ></TR ><TR ><TD >支持 <A HREF="function.rename.html" ><B CLASS="function" >rename()</B ></A ></TD ><TD >否</TD ></TR ><TR ><TD >支持 <A HREF="function.mkdir.html" ><B CLASS="function" >mkdir()</B ></A ></TD ><TD >否</TD ></TR ><TR ><TD >支持 <A HREF="function.rmdir.html" ><B CLASS="function" >rmdir()</B ></A ></TD ><TD >否</TD ></TR ></TBODY ></TABLE ></DIV > </P ><P > <DIV CLASS="table" ><A NAME="AEN302729" ></A ><P ><B >表 N-3. 上下文选项</B ></P ><TABLE BORDER="1" CLASS="CALSTABLE" ><COL><COL><COL><THEAD ><TR ><TH >名称</TH ><TH >用法</TH ><TH >默认值</TH ></TR ></THEAD ><TBODY ><TR ><TD ><TT CLASS="literal" >method</TT ></TD ><TD ><TT CLASS="constant" ><B >GET</B ></TT >、<TT CLASS="constant" ><B >POST</B ></TT > 或任何其它被远程服务器支持的 HTTP 方式。</TD ><TD ><TT CLASS="constant" ><B >GET</B ></TT ></TD ></TR ><TR ><TD ><TT CLASS="literal" >header</TT ></TD ><TD > 请求中要发送的附加的头信息。此选项中的值将覆盖其它值(例如 <TT CLASS="literal" >User-agent:</TT >,<TT CLASS="literal" >Host:</TT > 和 <TT CLASS="literal" >Authentication:</TT >)。 </TD ><TD > </TD ></TR ><TR ><TD ><TT CLASS="literal" >user_agent</TT ></TD ><TD > 在 User-Agent: 头信息中要发送的值。此值仅用于<SPAN CLASS="emphasis" ><I CLASS="emphasis" >没有</I ></SPAN >在上面 <TT CLASS="literal" >header</TT > 的上下文选项中指定 user-agent 时。 </TD ><TD > <TT CLASS="filename" >php.ini</TT > 设置:<TT CLASS="literal" >user_agent</TT > </TD ></TR ><TR ><TD ><TT CLASS="literal" >content</TT ></TD ><TD > 头信息之后要发送的附加数据。典型用于 POST 或 PUT 请求。 </TD ><TD > </TD ></TR ><TR ><TD ><TT CLASS="literal" >proxy</TT ></TD ><TD > 以 URI 格式指定的代理服务器(例如 <TT CLASS="literal" >tcp://proxy.example.com:5100</TT >)。HTTPS 代理(通过 HTTP 代理服务器)仅在 PHP 5.1.0 或更高版本可用。 </TD ><TD > </TD ></TR ><TR ><TD ><TT CLASS="literal" >request_fulluri</TT ></TD ><TD > 设置为 <TT CLASS="constant" ><B >TRUE</B ></TT > 时,建立请求时整个 URI 将被使用。(即 <TT CLASS="literal" >GET http://www.example.com/path/to/file.html HTTP/1.0</TT >)。 而这是一个非标准请求格式,某些代理服务器需要它。 </TD ><TD ><TT CLASS="constant" ><B >FALSE</B ></TT ></TD ></TR ><TR ><TD ><TT CLASS="literal" >max_redirects</TT ></TD ><TD > 连续重定向的最大值。取值为 <TT CLASS="literal" >1</TT > 或更小的值表示不跟随重定向。PHP 5.1.0 新加的。 </TD ><TD >20</TD ></TR ></TBODY ></TABLE ></DIV > </P ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >底层的套接字流(socket stream)上下文选项: </B > 有可能通过<A HREF="transports.html#transports.inet" >底层传输(underlying transport)</A >支持附加的上下文选项。对于 <TT CLASS="literal" >http://</TT > 流,参考 <TT CLASS="literal" >tcp://</TT > 传输的上下文选项。对于 <TT CLASS="literal" >https://</TT > 流,参考 <TT CLASS="literal" >ssl://</TT > 传输的上下文选项。 </P ></BLOCKQUOTE ></DIV ></DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><A HREF="wrappers.socket.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="index.html" ACCESSKEY="H" >起始页</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="wrappers.ftp.html" ACCESSKEY="N" >下一页</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >Socket</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="wrappers.html" ACCESSKEY="U" >上一级</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >FTP 和 FTPS</TD ></TR ></TABLE ></DIV ></BODY ></HTML >