标头位置未采用声明的路径

时间:2019-01-10 23:07:35

标签: php

我试图在$ _SESSION数组的键为空的情况下终止会话,然后重定向到破坏会话的脚本并重定向到索引。这是我的文件结构

backend
  apis
    profiles
      search.php
  core
    session_end.php
    CoreTools.php
frontend
index.php
landing.php

这是CoreTools.php代码

class CoreTools{

  protected $session;
  public function __construct( $inSession ){
      $this->session = $inSession;
  }


  public function sessionLost(){

    $return = false;
    if( empty( $this->session ) ){
      $return = true;

    }else{
      foreach( $this->session as $s ){
          if( empty( $s ) ){$return = true;}
      }
    }


    return $return;
  }

  public function checkPermissions( $perm ){
    if( self::sessionLost() ){
     header('Location: session_end.php');

    }else{
      //too much code
      return true;
    }
  }
}

以上代码由search.php

调用
session_start();
require '../../core/CoreTools.php';
$_SESSION = null;
$tools = new CoreTools( $_SESSION );
if( !$tools->checkPermissions( 'get' ) ){
    $response['success'] = false;
    $response['message'] = 'Not allowed';

  }else{


  }

我故意设置$_SESSION = null来测试代码

search.phplanding.php通过AJAX调用

我遇到404错误

如果我使用

header('Location: session_end.php');

服务器响应

  

未找到请求的URL /backend/apis/profiles/session_end.php为   在此服务器上找不到。

     

此外,尝试执行404找不到错误   使用ErrorDocument来处理请求。

好像正在搜索个人档案文件夹中的session_end.php文件,为什么? CoreTools.php除了session_end.php之外,还位于核心文件夹中

我也尝试过这种方式

header('Location: http://www.mysite.tv/backend/core/session_end.php');

它返回CORS错误(我现在不想配置CORS)

也是如此

$path = $_SERVER['HTTP_HOST'] . '/backend/core/session_end.php';
header('Location: ' . $path);

这是404错误

  

未找到请求的URL   /backend/apis/profiles/http//www.mysite.tv/backend/core/session_end.php   在此服务器上找不到。

     

此外,尝试执行404找不到错误   使用ErrorDocument来处理请求。

这是绝望的解决方案

echo '<script>window.location.href="./backend/core/session_end.php"</script>';

它不起作用

我的代码有什么问题?

1 个答案:

答案 0 :(得分:4)

相对URL是由客户端而不是服务器处理的。客户端相对于它所加载的URL对其进行解释,该URL位于profiles文件夹中,因此它将在其中寻找session_end.php

重定向AJAX调用没有什么意义,因为AJAX不会在客户端上重新加载页面。

CORS错误可能是由使用https:进行的原始AJAX调用引起的,但是您将重定向到http:,这被认为是不同的域。您可以在URL中省略协议和域,它将从原始URL继承它们。

header('Location: /backend/core/session_end.php');