PHP标头位置不起作用/没有HTTP状态:更改

时间:2018-05-18 03:21:27

标签: php http nginx header location

我在PHP中使用Headers时遇到问题。 header('location: http:google.com');无效。这是我的代码:

if(!headers_sent()){
    header("location: http://google.com");
    exit;
}

HTML Data...

脚本正在退出,但header()无效。

  • 我已经在我的php.ini中检查了output_buffer param,它已设置为4096.
  • PHP开头标记
  • 上方没有额外的行
  • 我的脚本采用UTF-8编码,没有BOM。
  • 启用了所有错误,但我没有收到任何错误/警告/通知。发生了什么事?
  • 环境:PHP 7.0.27和NGINX。

后来的尝试和调试步骤结束了:

  • header("location: http://google.com";, true, 302);没有任何区别
  • header("Refresh: ...")确实成功了。
  • HTTP响应调试(被问过几次后):

    StatusCode : 200 
    StatusDescription : OK 
    Content : <br />  <b>Notice</b>: Undefined index: HTTP_ACCEPT_LANGUAGE in ...
    RawContent : HTTP/1.1 200 OK 
    Transfer-Encoding: chunked 
    Connection: keep-alive 
    Pragma: no-cache 
    Cache-Control: no-store, no-cache, must-revalidate 
    Content-Type: text/html; charset=UTF-8 
    Date: Fri, 18 May 201... 
    Forms : {} 
    Headers : {[Transfer-Encoding, chunked], [Connection, keep-alive],
    

仍然没有回答:

    来自副本的
  • header("Status: 303 etc");header('HTTP/1.1 301 Moved Permanently');

  • 状态cgi.rfc2616_headers

  • PHP SAPI

  • 在phar。

  • 之外运行示例代码

2 个答案:

答案 0 :(得分:1)

是的,这不仅仅是解决问题的方法,而是在您开发服务器上时重新定向工作客户端的工作。我编写了一个中间件函数来为您生成重定向标题,只需将其添加到您的代码中,然后调用Redirect("URL");

<?php

function Redirect($location, $delay=0) {
    // Check to see if the header are already sent.
    if(!headers_sent()) {
        // Check to see if we want Refresh because Location isn't working.
        if(defined('REDIRECT_ALTERNATIVE')) {
            // We want Refresh, let's go!
            header("Refresh: $delay; URL=\"$location\"");  
            exit;
        }

        // We want to do this server side, do it!
        header("Location: $location");
        exit;
    }
}

既然你有这个功能你需要做的就是在一个文件中,最好是一个常量或配置文件,使用代码define('REDIRECT_ALTERNATIVE', true);然后启用客户端重定向,当你完成简单注释或删除该定义,它将切换回服务器端。

同样,这不是一个解决方案,因为它是一个解决方案,但是经过OP的测试后,这就是我们设法提出的。

编辑:对于任何想知道实际问题是什么的人来说,OP的开发服务器,无论出于何种原因,总是将http代码设置为200,即使我们手动更改它,因为我没办法为了访问他的电脑并调试他的设置,我想出了一个解决方法,避免了他的服务器管理重定向的需要。

答案 1 :(得分:0)

试试这个。

     header("Refresh: $seconds; URL=\"$location\"");