3

カスタム フレームワークがあり、リクエストファイルでリクエストがajaxかどうかを検出します。ベースコントローラーで、ユーザーがログインしているかどうかを確認します。

If user is not logged in:
  1. if request is ajax - force JS redirect from PHP (unable to do)
  2. if request is not ajax - PHP redirect (header, works)

私はナンバー1を働かせることができません。

これが私のリダイレクトコードです:

//User::Redirect
public function redirect($url = SITE_URL, $isAjax = false) {
    if ($isAjax === true) {
        //its ajax call, echo js redirect
        echo '<script>window.location = ' . $url . ';</script>';
    } else {
        header("Location: {$url}");
    }
    exit;
}

ログインチェックのコード:

//Basecontroller::__construct
if ( ! $this->user->isLoggedIn()) {
   //redirect to login page
   $this->user->redirect('/login', $request->ajax()); 
   exit;
}

しかし、 ajax呼び出しでリダイレクトする代わりに、出力するだけです<script>window.location = URL</script>

ノート:

そこからリダイレクトを行うためにAJAX呼び出しのそれぞれにチェックを追加できることはわかっていますが、それを避けて、すべてのAJAX呼び出しにチェックを追加するのではなく、PHPスクリプトがベースコントローラーで検出してリダイレクトできるようにします(たくさん)。

4

3 に答える 3

3

JavaScript リダイレクトにはスクリプト タグが必要です。これを試して:

public function redirect($url = SITE_URL, $isAjax = false) {
    if ($isAjax === true) {
        //its ajax call, echo js redirect
        echo '<script>window.location = ' . $url . ';</script>';
    } else {
        header("Location: {$url}");
    }
    exit;
}

jQueryを想定して、ajax内でこれを処理するという点で

$.ajax(
    {
        type: "POST",
        url: url,
        data: postParams,
        success: function(data)
        {
            //do something with success response
        },
        error : function(httpObj, txtStatus)
        {
            if(httpObj.status == 401)
            {//redirect to login
                var loginUrl = '/login';
                document.location.href = loginUrl;
            }
            else if(httpObj.status == ...)  //etc
            {//do something

            }
            else
            {
                alert("Ajax\n Error: " + txtStatus + "\n HTTP Status: " + httpObj.status);
            }
        }
于 2013-08-06T21:51:02.980 に答える
1

クライアントはそれがjavascriptであることをどのように知ることになっていますか?

スクリプトタグで囲んでみてください。

<html>
<script>
window.location = 'testpage.html'
</script>
</html>
于 2013-08-06T21:51:12.663 に答える