После перенаправления из JS расположение заголовка не работает на сервере (но работает на локальном хосте)

#php #jquery #redirect

#php #jquery #перенаправление

Вопрос:

Я работаю над системой входа в систему, которая перенаправляет на соответствующий URL-адрес на основе usertype и user_activation_status. Приведенный ниже код:

 $.post(
        './assets/tasks/process-login.php',
        {
            email:email,
            password:password
        },
        function(data){
            console.log(data);
            if(data==1){
                $("#lblMessage_frmLogin").css("color","green");
                $("#lblMessage_frmLogin").text("Login successful.. Redirecting to your homepage").fadeIn();
                window.location.href=siteurl   '/my-home/';
            }else if(data==-2){
                $("#lblMessage_frmLogin").css("color","red");
                $("#lblMessage_frmLogin").html("Looks like you haven't registered with us, Please <a href='"   siteurl   "/home'> click here </a> to register.").fadeIn();
            }else{
                $("#lblMessage_frmLogin").css("color","red");
                $("#lblMessage_frmLogin").text("Login unsuccessful, please recheck the details you have entered.").fadeIn();
            }
        });
 

Я не включил ./assets/tasks/process-login.php его, опасаясь удлинить пост. Он просто повторяет 1 для успеха, 0 для неправильного пароля, -2 для несуществующей электронной почты.

После перенаправления на /my-home/ в заголовке страницы есть проверка для user_activation_status , которая, в свою очередь, должна перенаправить страницу на соответствующую страницу.

/my-home/index.php

 <?php include './includes/meta.php';
      include './includes/header-nav.php';
      check_user_action_status($_SESSION['logged_in_userid']);
    switch ($usertype) {
    case 1:
        $selected_dashboard='candidate-dashboard.php';
        break;
    case 2:
        $selected_dashboard='expert-dashboard.php';
        break;
    case 3:
        $selected_dashboard='admin-dashboard.php';
        break;

    default:
        if($usertype=="") user_logout();
        break;

}
    include './includes/page-content/'.$selected_dashboard; 
    include './includes/footer.php'; 
?>
 

Функция:

 /**
Function to check if the user has confirmed email and filled profile, uploaded docs or disabled.
Params : userid
Returns none; Redirects to appropriate page, or logs out if user not logged in.
**/
function check_user_action_status($userid){
    $userid=trim(sqlescapes($userid));
    if($get_row = mysqli_query($GLOBALS['conn'], "select user_type,user_activation_status from tbl_users where user_id=$userid")){
        if (mysqli_num_rows($get_row) > 0) {
            if($got_row=mysqli_fetch_object($get_row)){
                if($got_row->user_activation_status==0){
                    header("location:".$GLOBALS['siteurl']."/my-home/confirm-email");
                }else if($got_row->user_activation_status==1){
                    header("location:".$GLOBALS['siteurl']."/my-home/my-profile?id=start");
                }else if($got_row->user_activation_status==-1){
                    header("location:".$GLOBALS['siteurl']."/my-home/disabled-account");
                }

                if($got_row->user_type==2){
                    if($got_row->user_activation_status==2){
                        header("location:".$GLOBALS['siteurl']."/my-home/upload-docs");
                    }
                }
            }
        }else{
            user_logout();
        }
        }else{
            user_logout();
        }

}
 

(пожалуйста, обратите внимание, $GLOBALS['siteurl']='http://localhost/tlaqi/' . user_logout() и sqlescapes() являются определяемыми пользователем функциями для соответствующей функциональности)

Логика отлично работает на локальном хосте, но когда я загружаю на сервер, после входа в систему он не перенаправляет на соответствующую страницу, как определено в check_user_action_status() , даже если условия выполнены. Вместо этого он просто загружается /my-home/index.php .

Где я ошибаюсь?

Комментарии:

1. добавьте ob_start(); в самом начале php-скрипта. Если он включает в себя другой файл, тогда не используйте?> в конце.

2. @mymotherland, meta.php ( include './includes/meta.php'; ) имеет ob_start(); в первой строке, а нижний колонтитул имеет ob_flush();

3. HTTP-заголовки должны быть отправлены перед HTTP-ответом. Т.Е. Вы должны вызвать заголовок, прежде чем повторять что-либо еще или отправлять какой-либо HTML.

4. Есть ли пробел перед первым <?php?

Ответ №1:

Заголовок должен быть установлен перед отправкой выходных данных.Добавьте ob_start(); в самом начале php-скрипта. Если он включает в себя другой файл, тогда не используйте?> в конце.

или попробуйте

 header("location:".$GLOBALS['siteurl']."/my-home/confirm-email");
exit();
 

или echo "<script>location='your_url.com'</script>";

Комментарии:

1. Может работать в одной среде, но не в другой, потому что output_buffering установлен на вашем локальном хосте php.ini, но не на сервере.

Ответ №2:

Я сталкивался с подобной проблемой раньше, и теперь я header('Location: pageExample.php'); больше не использую, вместо этого я использую JavaScript document.location .

Измените:

 header('Location: page1.php');
 

К чему-то вроде этого:

 echo "<script type='text/javascript'> document.location = 'page1.php'; </script>";