Questo è per Larave 5.2.xe versioni successive. Se vuoi avere un'opzione per servire alcuni contenuti su HTTPS e altri su HTTP, ecco una soluzione che ha funzionato per me. Potresti chiederti, perché qualcuno dovrebbe voler servire solo alcuni contenuti su HTTPS? Perché non pubblicare tutto tramite HTTPS?
Anche se va benissimo servire l'intero sito su HTTPS, tagliare tutto su HTTPS ha un sovraccarico aggiuntivo sul tuo server. Ricorda che la crittografia non è economica. Il leggero sovraccarico ha anche un impatto sul tempo di risposta della tua app. Si potrebbe sostenere che l'hardware di base è economico e l'impatto è trascurabile, ma sto divagando :) Non mi piace l'idea di offrire contenuti di marketing grandi pagine con immagini ecc. Su https. Quindi eccolo qui. È simile a quello che altri hanno suggerito sopra usando il middleware, ma è una soluzione completa che ti consente di alternare tra HTTP / HTTPS.
Per prima cosa crea un middleware.
php artisan make:middleware ForceSSL
Questo è l'aspetto che dovrebbe avere il tuo middleware.
<?php
namespace App\Http\Middleware;
use Closure;
class ForceSSL
{
public function handle($request, Closure $next)
{
if (!$request->secure()) {
return redirect()->secure($request->getRequestUri());
}
return $next($request);
}
}
Nota che non sto filtrando in base all'ambiente perché ho una configurazione HTTPS sia per lo sviluppo locale che per la produzione, quindi non è necessario.
Aggiungi quanto segue a routeMiddleware \ App \ Http \ Kernel.php in modo da poter scegliere e scegliere quale gruppo di route deve forzare SSL.
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'forceSSL' => \App\Http\Middleware\ForceSSL::class,
];
Successivamente, vorrei proteggere due gruppi di base di accesso / registrazione ecc. E tutto il resto dietro il middleware di Auth.
Route::group(array('middleware' => 'forceSSL'), function() {
/*user auth*/
Route::get('login', 'AuthController@showLogin');
Route::post('login', 'AuthController@doLogin');
// Password reset routes...
Route::get('password/reset/{token}', 'Auth\PasswordController@getReset');
Route::post('password/reset', 'Auth\PasswordController@postReset');
//other routes like signup etc
});
Route::group(['middleware' => ['auth','forceSSL']], function()
{
Route::get('dashboard', function(){
return view('app.dashboard');
});
Route::get('logout', 'AuthController@doLogout');
//other routes for your application
});
Conferma che i tuoi middleware siano applicati correttamente ai tuoi percorsi dalla console.
php artisan route:list
Ora che hai protetto tutti i moduli o le aree sensibili della tua applicazione, la chiave ora è usare il tuo modello di visualizzazione per definire i tuoi collegamenti sicuri e pubblici (non https).
In base all'esempio sopra, renderesti i tuoi link protetti come segue:
<a href="{{secure_url('/login')}}">Login</a>
<a href="{{secure_url('/signup')}}">SignUp</a>
I collegamenti non protetti possono essere visualizzati come file
<a href="{{url('/aboutus',[],false)}}">About US</a></li>
<a href="{{url('/promotion',[],false)}}">Get the deal now!</a></li>
Ciò che fa è restituire un URL completo come https: // yourhost / login e http: // yourhost / aboutus
Se non si esegue il rendering dell'URL completo con http e si utilizza un URL di collegamento relativo ("/ aboutus"), https persisterà dopo che un utente ha visitato un sito protetto.
Spero che questo ti aiuti!