PHP标头不在HTTPS上重定向

时间:2013-06-25 13:28:58

标签: php http-redirect

我希望在保存数据后重定向到特定的网址。

我用过:

header('Location: https://linkbook.co/index.php/site/saveUrl');

并没有奏效。

为什么?

整个代码:

public function actionSaveUrl(){
            $criteria = new CDbCriteria();
            $criteria->limit = 1;
            $criteria->order = 'id asc';
            $model_url = Url::model()->FindByAttributes(array('saved_to_file'=>0,'status'=>1),$criteria);
            if($model_url){
                echo $model_url->link;
                CurlTool::downloadFile($model_url->link,'url_' . $model_url->id . '.html');
                $model_url->saved_to_file = 1;
                if( $model_url->validate() && $model_url->save() ){
                    echo 1;
                    header('Location: https://linkbook.co/index.php/site/saveUrl');
                    exit();
                }
                else{
                    echo 2;
                }
            }
        }

4 个答案:

答案 0 :(得分:8)

这是你的问题:

echo 1;

在您已将输出发送到浏览器后,您无法发送标头(除非您正在缓冲输出)。当你这样做时,你应该从PHP得到一条警告信息。

答案 1 :(得分:3)

在标题之前不能有任何输出,输出可以是:

  • 非故意:
    • 之前的空白
    • UTF-8字节顺序标记
    • 以前的错误消息或通知
  • 故意:
    • print,echo和其他产生输出的函数(如var_dump)
    • 之前的原始区域

有关详细信息,请查看this answer!

此外,如果您在php中启用错误可能会有所帮助,这样您就会收到错误消息,告诉您生成其他输出的位置。您可以通过将其放在php页面上来启用错误:

<?php 
ini_set('display_errors', 'On'); 
error_reporting(E_ALL); 
?>

答案 2 :(得分:2)

manual明确说:

  

请记住,在发送任何实际输出之前,必须通过普通HTML标记,文件中的空行或PHP来调用header()。使用include或require,函数或其他文件访问函数读取代码是一个非常常见的错误,并且在调用header()之前输出空格或空行。使用单个PHP / HTML文件时存在同样的问题。

你这样做:

 // <-- THIS LINE OUTPUTS SOMETHING
 echo $model_url->link;
 ...
 echo 1; // <-- THIS LINE OUTPUTS SOMETHING AS WELL
 // SO THIS WON'T WORK
 header('Location: https://linkbook.co/index.php/site/saveUrl');

所以:扫描您的程序以查找可能输出内容的任何程序行,并在之前移动header()电话

答案 3 :(得分:-1)

首先,你不应该在重定向之前有任何输出(echo 1;是什么?)

其次,在Yii中,您可以像这样重定向:

$this->redirect('https://linkbook.co/index.php/site/saveUrl');