Heim  >  Artikel  >  Backend-Entwicklung  >  php header函数用法详解举例(2)

php header函数用法详解举例(2)

WBOY
WBOYOriginal
2016-07-25 08:56:151067Durchsuche
  1. Header(“Location: http://www.php.net”;);
  2. exit; //在每个重定向之后都必须加上“exit”,避免发生错误后,继续执行。
  3. ?>
  4. header(“refresh:3;url=http://bbs.it-home.org”);
  5. print(‘正在加载,请稍等…
    三秒后自动跳转~~~’);
  6. header重定向 就等价于替用户在地址栏输入url
  7. ?>
复制代码

例二:禁止页面在IE中缓存 要使用者每次都能得到最新的资料,而不是 Proxy 或 cache 中的资料,可以使用下列的标头

  1. header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
  2. header('Last-Modified: '.gmdate('D, d M Y H:i:s') .' GMT');
  3. header('Cache-Control: no-store, no-cache, must-ridate');
  4. header('Cache-Control: post-check=0, pre-check=0',false);
  5. header('Pragma: no-cache');//兼容http1.0和https
  6. ?>
复制代码

CacheControl = no-cache Pragma=no-cache Expires = -1 Expires是个好东东,如果服务器上的网页经常变化,就把它设置为-1,表示立即过期。如果一个网页每天凌晨1点更新,可以把Expires设置为第二天的凌晨1点。 当HTTP1.1服务器指定CacheControl = no-cache时,浏览器就不会缓存该网页。

旧式 HTTP 1.0 服务器不能使用 Cache-Control 标题。所以为了向后兼容 HTTP 1.0 服务器,IE使用Pragma:no-cache 标题对 HTTP 提供特殊支持。 如果客户端通过安全连接 (https://) 与服务器通讯,且服务器在响应中返回 Pragma:no-cache 标题,则 Internet Explorer 不会缓存此响应。 注意:Pragma:no-cache 仅当在安全连接中使用时才防止缓存,如果在非安全页中使用,处理方式与 Expires:-1 相同,该页将被缓存,但被标记为立即过期。

http-equiv meta标记: 在html页面中可以用http-equiv meta来标记指定的http消息头部。老版本的IE可能不支持html meta标记,所以最好使用http消息头部来禁用缓存。 范例三: 让使用者的浏览器出现找不到档案的信息。 php的函数header()可以向浏览器发送Status标头, 如:header(”Status: 404 Not Found”)。 但实际上浏览器返回的响应却是:

  1. header(“Content-type: application/x-gzip”);
  2. header(“Content-Disposition: attachment; filename=文件名”);
  3. header(“Content-Description: PHP3 Generated Data”);
  4. ?>
复制代码

例五:header函数前输入内容 一般来说在header函数前不能输出html内容,类似的还有setcookie() 和 session 函数,这些函数需要在输出流中增加消息头部信息。如果在header()执行之前有echo等语句,当后面遇到header()时,就会报出 “Warning: Cannot modify header information – headers already sent by ….”错误。就是说在这些函数的前面不能有任何文字、空行、回车等,而且最好在header()函数后加上exit()函数。 例如下面的错误写法,在两个 php代码段之间有一个空行:

  1. //some code here
  2. ?>
  3. //这里应该是一个空行
  4. header(”http/1.1 403 Forbidden”);
  5. exit();
  6. ?>
复制代码

原因: PHP脚本开始执行时,它可以同时发送http消息头部(标题)信息和主体信息. http消息头部(来自 header() 或 SetCookie() 函数)并不会立即发送,相反,它被保存到一个列表中. 这样就可以允许你修改标题信息,包括缺省的标题(例如 Content-Type 标题).但是,一旦脚本发送了任何非标题的输出(例如,使用 HTML 或 print() 调用),那么PHP就必须先发送完所有的Header,然后终止 HTTP header.而后继续发送主体数据.从这时开始,任何添加或修改Header信息的试图都是不允许的,并会发送上述的错误消息之一。

解决办法: 修改php.ini打开缓存(output_buffering),或者在程序中使用缓存函数ob_start(),ob_end_flush() 等。原理是:output_buffering被启用时,在脚本发送输出时,PHP并不发送HTTP header。相反,它将此输出通过管道(pipe)输入到动态增加的缓存中(只能在PHP 4.0中使用,它具有中央化的输出机制)。你仍然可以修改/添加header,或者设置cookie,因为header实际上并没有发送。当全部脚本终止时,PHP将自动发送HTTP header到浏览器,然后再发送输出缓冲中的内容。



Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn