2017-09-30 2 views
0

私はページへのJSリダイレクトを実行する必要があるプロジェクトで作業していました.AJAXクエリを介してPHPでセッション変数を設定し、設定されています。チェックに成功すると、リダイレクトURLがJSで構築され、リダイレクトが実行されます。私がこれまで持っているものセッション変数をAJAXで設定した後のJSリダイレクト

は次のとおりです。

<?php 

$v_ip = $_SERVER['REMOTE_ADDR']; 
$hash = md5($v_ip); 

?> 

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 

<script> 

$.ajax({ 
    type : 'POST', 
    url : './session.php', 
    dataType: "json", 
    data: "<?php echo $hash; ?>", 
    success : function(data){}, 
    error : function(){} 
}); 
</script> 

<script> 

<?php 

if(isset($_SESSION['allow'])) { 

echo "var url = \"url-here/?token=\"; 
     var token = \"token\"; 
     var redirect = url.concat(token);"; 

} 

?> 

window.location.replace(redirect); 

</script> 
</head> 

</html> 

、変数設定PHPコード:ページへの最初の訪問で

<?php 

session_start(); 

$v_ip = $_SERVER['REMOTE_ADDR']; 
$hash = md5($v_ip); 

if(isset($_POST["$hash"])) { 

$_SESSION['allow'] = true; 

} 

?> 

を、すべてが正しく処理された作品実際のリダイレクトの時点までセッション変数が設定され、JSコードがページのコードに正しく出力され、何らかの理由で実際のwindow.location.replace関数がアクティブ化されません。ページは空白のままです。検査の結果、ソースコードがすべて正しく表示されますが、リダイレクトは発生しません。もう一度ページにアクセスすると、リダイレクトは正常に行われます。

両方のファイルでセッション変数の名前を変更してもう一度設定し直す必要がある場合、同じことが起こります。最初の訪問時にはリダイレクトは処理されませんが、実際のリダイレクト再度正しく処理されます。

どうしてですか?

答えて

0

初めてページにアクセスすると、セッション変数がまだ設定されていません。したがって、ifは失敗し、変数の割り当ては<script>に入れられません。ブラウザはセッション変数を設定するAJAX呼び出しを実行しますが、元のページに影響を与えるには遅すぎます。そのページに戻ってその効果を確認する必要があります。

ページ内のすべてのPHPが最初にサーバー上で実行され、出力がブラウザに送信され、JSが実行されることを覚えておいてください。

の機能にリダイレクトを実行するコードを入力することをお勧めします。$.ajax

+0

これは問題です - ifは失敗しません - 空白ページのソースコードを調べると、正しく出力された条件付きJSコードが表示されます。これはセッション変数が設定されていることを意味します。リダイレクトは何らかの理由で実行されません。リダイレクトURLの作成に使用されるすべての変数も正しく設定されています。 – Mirian

+0

'ソースの表示 'を使用していますか?それはURLの別の 'GET'を実行するので、実際には2度目にページに行くのが実際です。 – Barmar

+0

Javascriptコンソールにエラーがありますか? – Barmar

0

私はいくつかのことを操作する必要があると思います。

まず、php自体がテンプレートエンジンです。どういう意味ですか?できるだけPHPスクリプトを可能な限りHTMLに翻訳することを意味します。下のこのブロックはhtmlに変換され、静的なままになります。

<?php 

if(isset($_SESSION['allow'])) { 

    echo "var url = \"url-here/?token=\"; 
    var token = \"token\"; 
    var redirect = url.concat(token);"; 
} 
?> 

つまり、リダイレクト変数は、Ajaxコールの前に決定されます。これは、ページを2度目にリダイレクトする理由を説明しますが、初めてではありません。

第2に、window.location.replaceの前にAjax関連のコードを配置しても、期待通りの順序で撮影するわけではありません。これは、Ajaxコールが非同期操作であり、応答をいつ受け取るか予測できないためです。

{ 
    url: desired_url 
} 

希望:

$.ajax({ 
    type : 'POST', 
    url : './session.php', 
    dataType: "json", 
    data: "<?php echo $hash; ?>", 
    success : function(data){ 
    window.location.replace(data.url) 
    }, 
    error : function(){} 
}); 

第三に、あなたはJSONのような形式でサーバー側と応答でisset($_SESSION['allow'])事を検出する必要がありますようにこのような状況で、私はAjaxの呼び出しに成功したコールバックをwindow.location.replaceものを入れますこの助け。がんばろう。

関連する問題