2016-01-26 10 views
5

Ho avviato un nuovo progetto Laravel 5.2, utilizzando laravel new MyApp e aggiunto l'autenticazione tramite php artisan make:auth. Questo è destinato a essere un sito Web solo per i membri, in cui il primo utente viene seminato e crea il resto (nessuna creazione manuale dell'utente/reimpostazione della password/ecc.).Laravel reindirizzamenti imprevisti (302)

Questi sono i percorsi che ho attualmente definiti:

Route::group(['middleware' => 'web'], function() { 
    // Authentication Routes... 
    Route::get('user/login', ['as' => 'user.login',  'uses' => 'Auth\[email protected]']); 
    Route::post('user/login', ['as' => 'user.doLogin', 'uses' => 'Auth\[email protected]'  ]); 

    Route::group(['middleware' => 'auth'], function() { 
    // Authenticated user routes 
    Route::get('/', ['as'=>'home', 'uses'=> '[email protected]']); 
    Route::get('user/{uid?}', ['as' => 'user.profile', 'uses' => 'Auth\[email protected]' ]); 
    Route::get('user/logout', ['as' => 'user.logout', 'uses' => 'Auth\[email protected]' ]); 
    Route::get('/user/add', ['as' => 'user.add',  'uses' => 'Auth\[email protected]']); 

    [...] 
    }); 
}); 

posso entrare bene, però sto sperimentando un comportamento molto "funky" - quando provo ad uscire (tramite il built-in logout metodo che è stato creato via artigiano), la pagina esegue un reindirizzamento 302 a casa e sono ancora connesso.

Inoltre, mentre quasi tutte le pagine (non elencate qui) funzionano come previsto, user.add produce anche un 302 alla pagina iniziale.

si noti la home page è dichiarato al AuthController come $redirectTo, se questo fa alcuna differenza

ho scoperto il redirect tramite il DebugBar. Qualche idea su cosa cercare?

risposta

3

Dopo diverse ore di capelli tirati, ho trovato la mia risposta - ed è sciocco.

Il problema è che il percorso user.profile ha un percorso user/{uid?} e corrisponde sia user/logout e user/add come percorsi.

Essendo prima degli altri, e non avendo un'espressione regolare o simile, ha gestito il percorso.

io ancora non so perché una 302 è stato generato per che pagina, ma ha scoperto che lo spostamento fuori dal AuthController e nella UserController (dove dovrebbe essere fin dall'inizio) fissato il comportamento.

Così, la mia (modificata e di lavoro) percorsi ora guarda in questo modo:

Route::group(['middleware' => 'web'], function() { 
    // Authentication Routes... 
    Route::get('user/login', ['as' => 'user.login',  'uses' => 'Auth\[email protected]']); 
    Route::post('user/login', ['as' => 'user.doLogin', 'uses' => 'Auth\[email protected]'  ]); 

    Route::group(['middleware' => 'auth'], function() { 
    // Authenticated user routes 
    Route::get('/',  ['as'=>'home', 'uses'=> '[email protected]']); 
    Route::get('/home', ['as'=>'home', 'uses'=> '[email protected]']); 
    Route::get('user/logout', ['as' => 'user.logout', 'uses' => 'Auth\[email protected]' ]); 

    // *** Added /profile/ here to prevent matching with other routes **** 
    Route::get('user/profile/{uid?}', ['as' => 'user.profile', 'uses' => '[email protected]' ]); 
    Route::get('/user/add',   ['as' => 'user.add',  'uses' => '[email protected]']); 

    [...] 
    }); 
}); 
+0

anch'io, rimuovendo la funzione da AuthController risolta il problema .. –

+0

+1 Mi sono strappato i capelli tutto il pomeriggio con un problema simile. Non ho mai pensato di controllare in quale ordine erano i percorsi. –

1

Potrebbe essere la pagina di reindirizzamento predefinita dopo il logout è home e sembra che tu non abbia home nel tuo itinerario web. Prova il codice qui sotto nella tua AuthController.php

use AuthenticatesAndRegistersUsers, ThrottlesLogins; // after this line 
$redirectAfterLogout = 'login' // add this line 

Questo vi favore usare login pagina dopo il logout. Puoi cambiarlo in qualsiasi percorso, se lo desideri. Ho usato login come esempio.

O

È possibile cambiare dopo il logout percorso in \vendor\laravel\framework\src\Illuminate\Foundation\Auth\AuthenticatesUsers.php

public function logout() 
    { 
     Auth::logout(); 

     return redirect(property_exists($this, 'redirectAfterLogout') ? $this->redirectAfterLogout : 'login'); 
    } 

Ho cambiato il percorso di default per login. Se non hai $redirectAfterLogout nel tuo AuthController.php, cercherà qui il percorso di reindirizzamento. Non suggerisco alle persone di modificare qui, è una sorta di hard coding.

+0

'Route :: get ('/', ['as' = '' home ',' uses '=>' HomeController @ index ']);' Questa è una rotta 'home', ma non è possibile accedervi a meno che tu non abbia effettuato l'accesso. Sei corretto, un "reindirizzamento" da "logout" dovrebbe, di default, tornare alla pagina "login". –

+0

come detto sopra, 'home' è il nome del percorso - e quello che vedo è che la richiesta va a 'AuthController @ logout' e viene reindirizzata a' HomeController @ index' – hexblot

3

ho incontrato un problema con reindirizzamenti 302 durante la pubblicazione richieste Ajax. La soluzione in questo caso era di ricordare di includere il token CSRF.

Vedere i documenti laravel 5.4 qui: https://laravel.com/docs/5.4/csrf

+0

Ho anche avuto questo problema durante le richieste Ajax dove sto convalidando alcuni dati. E il campo da convalidare non corrispondeva al campo nel modulo. – Raccoon

0

ho avuto questo problema e si è scoperto che avevo un percorso: reindirizzare dentro il mio controller ajax. che non ha senso perché ovviamente dobbiamo restituire ajax ma stavo restituendo una rotta!