Перенаправить на новый URL-адрес после бэкэнд script

У меня есть страница signup.php, содержащая логин через кнопку facebook. структура страницы - это что-то вроде этого

<?php
if(!isset($_SESSION['logged_in']))
{
    echo '<div id="results">';
    echo '<!-- results will be placed here -->';
    echo '</div>';
    echo '<div id="LoginButton">';
    echo '<a href="#" rel="nofollow" class="fblogin-button" onClick="javascript:CallAfterLogin();return false;">Login with Facebook</a>';
    echo '</div>';
}
else
{
    echo 'Hi '. $_SESSION['user_name'].'! You are Logged in to facebook, <a href="?logout=1">Log Out</a>.';
}
?>

Код ajax, используемый на этой странице, вызывает другую страницу process_facebook.php и обрабатывает данные на сервере. код, используемый для ajax на странице signup.php,

<script type="text/javascript">
window.fbAsyncInit = function() {
    FB.init({
        appId: '<?php echo $appId; ?>',
        cookie: true,xfbml: true,
        channelUrl: '<?php echo $return_url; ?>channel.php',
        oauth: true
        });
    };
(function() {
    var e = document.createElement('script');
    e.async = true;e.src = document.location.protocol +'//connect.facebook.net/en_US/all.js';
    document.getElementById('fb-root').appendChild(e);}());

function CallAfterLogin(){
    FB.login(function(response) {       
        if (response.status === "connected") 
        {
            LodingAnimate(); //Animate login
            FB.api('/me', function(data) {

              if(data.email == null)
              {
                    //Facbeook user email is empty, you can check something like this.
                    alert("You must allow us to access your email id!"); 
                    ResetAnimate();

              }else{
                    AjaxResponse();
              }

          });
         }
    },
    {scope:'<?php echo $fbPermissions; ?>'});
}

//functions
function AjaxResponse()
{
     //Load data from the server and place the returned HTML into the matched element using jQuery Load().
     $( "#results" ).load( "process_facebook.php" );
}

//Show loading Image
function LodingAnimate() 
{
    $("#LoginButton").hide(); //hide login button once user authorize the application
    $("#results").html('<img src="img/ajax-loader.gif" /> Please Wait Connecting...'); //show loading image while we process user
}

//Reset User button
function ResetAnimate() 
{
    $("#LoginButton").show(); //Show login button 
    $("#results").html(''); //reset element html
}

</script>

Теперь проблема заключается в том, что страница process_facebook.php работает с данными fb на бэкэнд и после этого перенаправляется обратно на страницу signup.php и отображает данные, напечатанные на странице process_facebook.php(необязательно). Я хочу, чтобы вместо перенаправления с страницы process_facebook.php на страницу signup.php и отображения ее данных, я хочу перенаправить на другую страницу, а не только новые данные должны загрузиться с новой страницы, но url также должен получить изменено. (например, www.example.com/app/signup.php следует изменить на www.example.com/app/profile.php)

я забыл упомянуть, но я попытался использовать header() для перенаправления, но он просто извлекает данные на странице profile.php, но показывает URL-адрес www.example.com/app/signup.php. Теперь проблема в нем заключается в том, что если я обновляю страницу по какой-либо причине, тогда загружаются данные старой страницы signup.php

Ответ 1

Сделайте одно вставку ниже функции в вашем файле функции: -

function redirect($url=NULL)
{
    if(is_null($url)) $url=curPageURL();
    if(headers_sent())
    {
        echo "<script>window.location='".$url."'</script>";
    }
    else
    {
        header("Location:".$url);
    }
    exit;
}

И вызов этой функции:

redirect($url);

поэтому, когда вы получите данные из facebook, после применения проверки на $user_profile вы можете перенаправить пользователя с помощью функции выше, эта функция проверяет, уже ли отправлен заголовок, тогда он будет использовать javascript, иначе он будет использовать заголовок().

Ответ 2

Заголовкам нужно идти в верхней части страницы, прежде чем какой-либо HTML будет выводиться клиенту. Вы также можете выводить данные, так как сервер переходит на страницу "пишут" HTML клиенту.

Перед любым HTML, но после открытия PHP используйте это:

header('Location: http://www.example.com/');

Referr to: http://php.net/manual/en/function.header.php

Ответ 3

Если я пойду правильно, вы используете Facebook для сеанса пользователя, и весь код Facebook, который вы используете, - это Javascript, поэтому вы хотите использовать javascript для перенаправления...

document.location = '/profile.php';

Для этого необходимо установить место, где завершается вызов на конец.

Ответ 4

Просто примените die(); после вашего вызова заголовка.

Ответ 5

Как сказал Гарри, вы наверняка захотите сделать это через JS.

document.location = '/profile.php';

function CallAfterLogin(){
    FB.login(function(response) {       
        if (response.status === "connected") 
        {
            LodingAnimate(); //Animate login
            FB.api('/me', function(FBdata) {

              if(FBdata.email == null)
              {
                    //Facbeook user email is empty, you can check something like this.
                    alert("You must allow us to access your email id!"); 
                    ResetAnimate();

              }else{
                    //you need to call some PHP скрипт via ajax here to send these details to your server.
                    $.post('fbResponseParse.php',FBdata)
                    // your php should return some sort of an ok, or even a url for you to redirect to. 
                    //if it fails you need to display an error not redirect.
                      .done(function(data){
                       //data in this scope is the response from your PHP скрипт. 
                          if(data.success) document.location = '/profile.php';
                          else displayError(data.errorMess)
                       })
              }

          });
         }
    },
    {scope:'<?php echo $fbPermissions; ?>'});
}

Итак, что вы делаете, это использование JS для общения с Facebook. Затем после этого ответа вы отправляете его на задний план через AJAX. Ваш задний конец должен анализировать данные, создавать данные сеанса, что наиболее важно, хотя оно отправляет вам успех (bool) и errorMess (если применимо), тогда вы используете .done для синтаксического анализа успешных/неудачных и рендеринговых сообщений. Это будет держать клиента здесь, на странице регистрации, если материал facebook не будет успешным.