header函数使用注意

header应该注意的几个问题

header("Location:")作为php的转向语句。其实在使用中,他有几点需要注意的地方。

要求header前没有任何输出

但是很多时候在header前我们已经输出了好多东西了,此时如果再次header的话,显然是出错的,在这里我们启用了一个ob的概念,ob的意思是在服务器端先存储有关输出,等待适当的时机再输出,而不是像现在这样运行一句,输出一句,发现header语句就只能报错了。

具体的语句有: ob_start(); ob_end_clean();ob_flush();.........
所以,标准的使用方法是:

ob_start();

........

if ( something ){

ob_end_clean();

header("Location: yourlocation");

exit;

else{

..........

ob_flush(); //可省略

要想在header前有输出的话,可以修改php.ini文件

output_handler =mb_output_handler

output_handler =on

Output Control 函数可以让你自由控制脚本中数据的输出。它非常地有用,特别是对于:当你想在数据已经输出后,再输出文件头的情况。输出控制函数不对使用 header()setcookie(), 发送的文件头信息产生影响,只对那些类似于 echo() 和 PHP 代码的数据块有作用。

在header(“Location:”)后要及时exit

否则他是会继续执行的,虽然在浏览器端你看不到相应的数据出现,但是如果你进行抓包分析的话,你就会看到下面的语句也是在执行的。而且被输送到了浏览器客户端,只不过是没有被浏览器执行为html而已(浏览器执行了header进行了转向操作)。

下面这段是实际工作中写程序遇到的BUG,header后,没有结束掉程序,后果很严重:

public function getCode()
{
    $cur_pageurl = GetCurrentpageURL();
    $thisurl = $cur_pageurl;
    //======debug===================
    $write_str_code .= 'thisurl='.$thisurl.PHP_EOL; 
    $write_str_code .= 'cur_pageurl='.$cur_pageurl.PHP_EOL;      
    //======debug===================
    $code_url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$this->appid.'&redirect_uri='.urlencode($thisurl).'&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect';

    $write_str_code .= 'code_url='.$code_url.PHP_EOL;
    if (empty($_GET['code']))
    {
        $write_str_code .= '执行跳转'.PHP_EOL; 
         //Header("Location: $code_url");
         header("Location:$code_url");
         exit;//此处不能省略
    }
    $code = empty($_GET['code']) ? '':  $_GET['code'];
    $write_str_code .= 'code='.$code.PHP_EOL;
    write2file(date('Y-m-d H:i:s').'|getCode|获取code监控|data='.$write_str_code,'log','getCode');      
    return $code;
}
//=========
//....此处省略通过code获取openid的代码

上面这段代码的意思 获取微信公众号的code,用于获取用户的openid,但是一开始时程序没有在header之后,exit,这样就将导致程序继续执行,在获取openid的时候一直提示code missing,所以切记在header后要exit

### PHP 中 `header()` 函数的详细用法与功能说明 `header()` 函数PHP 中用于向客户端发送原始 HTTP 头信息。它必须在任何实际输出之前调用,包括 HTML 标签、空行或空格等[^2]。 #### 1. 基本语法 函数的基本语法如下: ```php void header ( string $string [, bool $replace = true [, int $http_response_code ]] ) ``` - `$string`: 要发送的头信息字符串。 - `$replace`: 可选参数,默认为 `true`,表示替换掉同名的头信息;如果设置为 `false`,则会添加一个新的头信息。 - `$http_response_code`: 可选参数,用于强制设置 HTTP 响应状态码。 #### 2. 常见用法 ##### (1) 重定向页面 通过 `header()` 函数可以实现页面的重定向,例如 301 永久重定向或 302 临时重定向。 ```php header("Location: https://www.example.com", true, 301); // 301永久重定向 ``` 此代码将用户重定向到指定 URL,并设置 HTTP 状态码为 301。 ##### (2) 设置内容类型 可以使用 `header()` 函数来指定返回内容的 MIME 类型。 ```php header("Content-Type: application/json"); // 返回 JSON 数据 header("Content-Type: text/html; charset=UTF-8"); // 返回 HTML 页面并指定字符集 ``` ##### (3) 强制下载文件 通过设置 `Content-Disposition` 头信息,可以让浏览器提示用户下载文件而不是直接打开。 ```php header('Content-Type: application/zip'); // 设置 MIME 类型为 zip 文件 header('Content-Disposition: attachment; filename="example.zip"'); // 强制下载文件名为 example.zip ``` 如果将 `attachment` 替换为 `inline`,则表示在线打开文件[^4]。 ##### (4) 自定义 HTTP 状态码 可以通过 `header()` 函数自定义 HTTP 响应状态码。 ```php header("HTTP/1.1 404 Not Found"); // 返回 404 错误 header("HTTP/1.1 500 Internal Server Error"); // 返回 500 错误 ``` ##### (5) 缓存控制 可以使用 `header()` 函数来控制浏览器缓存行为。 ```php header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); // 禁止缓存 header("Pragma: no-cache"); // 兼容旧版浏览器 ``` #### 3. 注意事项 - 必须确保在调用 `header()` 函数之前没有任何输出,否则会导致报错:`headers already sent`。 - 如果需要跨多个文件使用 `header()`,请确保所有文件都没有多余的空格或换行符。 #### 4. 示例代码 以下是一个完整的示例,展示如何使用 `header()` 实现页面重定向和强制下载文件的功能: ```php <?php // 页面重定向 header("Location: https://www.example.com", true, 302); // 强制下载文件 header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="example.txt"'); header('Content-Length: ' . filesize('example.txt')); readfile('example.txt'); ?> ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值