5

このRedirectクラスを使用して、ログインしていないユーザーをログイン ページに送り、ステータス コード401を付けています。

return Redirect::to('login', 401);

これにより、正しいロケーション ヘッダーが送信されますが、ステータス コードは302に設定されます。


私はそれを基本Responseクラスまでたどりました

laravel/ベンダー/Symfony/コンポーネント/HttpFoundation/Response.php

そしてそれは呼んでいます:

$this->setStatusCode($status);

正しい401コードで。


私もオブジェクトをダンプしようとしました:

var_dump( Redirect::to('login', 401)->foundation );

保護されたプロパティが401statusCodeに正しく設定されていることがわかります。


それでも、生成されたレスポンスの HTTP ステータス コードは302に設定されます。

何を与える?私はそれを間違って使用していますか?


PSこれもLaravelのフォーラムに投稿しましたが、役に立ちませんでした。

4

4 に答える 4

4

これはlaravelが原因ではありません。これを再現するには(Windowsではphp 5.4):

<?php
header("HTTP/1.1 401 Unauthorized");
header("Location: http://www.google.com");

PHPが302に設定しているようです:

$ php-cgi "test.php"
Status: 302 Moved Temporarily
Location: http://www.google.com
Content-type: text/html; charset=UTF-8

PHP ソース コードの main/SAPI.C:

} else if (!STRCASECMP(header_line, "Location")) {
    if ((SG(sapi_headers).http_response_code < 300 ||
        SG(sapi_headers).http_response_code > 307) &&
        SG(sapi_headers).http_response_code != 201) {
        /* Return a Found Redirect if one is not already specified */
        if (http_response_code) { /* user specified redirect code */
            sapi_update_response_code(http_response_code TSRMLS_CC);
        } else if (SG(request_info).proto_num > 1000 && 
           SG(request_info).request_method && 
           strcmp(SG(request_info).request_method, "HEAD") &&
           strcmp(SG(request_info).request_method, "GET")) {
            sapi_update_response_code(303 TSRMLS_CC);
        } else {
            sapi_update_response_code(302 TSRMLS_CC);
        }
    }

ご覧のとおり、 を使用するheader()"Location"、http ステータス コードが 302 に変更されます。

逆の方法で実行すると、機能させることができます。

<?php
header("Location: http://www.google.com");
header("HTTP/1.1 401 Unauthorized");

これにより、次のようになります。

$ php-cgi "test.php"
Status: 401 Unauthorized
Location: http://www.google.com
Content-type: text/html; charset=UTF-8

しかし、laravelはステータスを設定した後に場所を設定するため、ステータスはとにかく302に戻されます。しかし、これは論点です。ロケーション ヘッダーでステータスを 401 に正常に設定したとしても、ブラウザはリダイレクトをたどりません。

于 2012-11-20T23:40:56.663 に答える
4

ブラウザではこれができません。401 でリダイレクトすることはできません。

于 2012-11-20T23:41:05.713 に答える
1

私はさらにそれをたどりましpublic function sendHeaders()laravel/vendor/Symfony/Component/HttpFoundation/Response.php...最終ステータスヘッダーを生成するまで...

   // status
    Header(sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText));

...もちろん、まだ 401 でした。

それからそれは私に夜明けしました。ClientError である 401 でリダイレクトすることはできません。

(同じファイルisRedirectに記載されているテストにも失敗します。送信するとすぐに302に修正されます(デフォルトではステータスが200であるため、更新する必要があります。PHPは、それがすでに別のものに更新されています)。Response.phpmod_phpLocation

于 2012-11-21T00:18:17.120 に答える
0

他の人が指摘したように、401 リダイレクトのようなものはありません。私がこれに夢中になった理由は、非 AJAX ユーザーをリダイレクトする必要があるためですが、AJAX リクエストは 401 を取得する必要があります


同様の状況に陥った場合、私が最終的に使用したのは次のとおりです。

return Request::ajax() ?
         Response::make('', 401, array('HTTP/1.1 401 Unauthorized')) :
         Redirect::to('login', 302);

これは、ヘッダーの処理に Laravel のメソッドを使用します。


バニラ PHP を使用している場合は、これを使用します。

$is_ajax_request = ! empty( $_SERVER['HTTP_X_REQUESTED_WITH'] ) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest';

$is_ajax_request ?
    header('HTTP/1.1 401 Unauthorized') :
    header('Location: http://site.com/login');

exit;
于 2012-11-21T20:12:24.743 に答える