这适用于Larave 5.2.x及更高版本。如果您想选择通过HTTPS提供某些内容,而通过HTTP提供其他内容,那么这里的解决方案对我有用。您可能想知道,为什么有人只想通过HTTPS提供某些内容?为什么不通过HTTPS提供所有服务?
尽管通过HTTPS服务整个站点是完全可以的,但是通过HTTPS切断一切都会增加服务器的开销。请记住,加密并不便宜。轻微的开销也会影响您的应用响应时间。您可能会争辩说,商品硬件价格便宜,影响可忽略不计,但我离题了:)我不喜欢这样的想法,即通过https为营销内容的大页面提供图像等。所以就这样。它类似于上面其他人使用中间件的建议,但是它是一个完整的解决方案,允许您在HTTP / HTTPS之间来回切换。
首先创建一个中间件。
php artisan make:middleware ForceSSL
这就是您的中间件的外观。
<?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);
}
}
请注意,我没有根据环境进行过滤,因为我为本地开发人员和生产人员都设置了HTTPS,因此不需要这样做。
将以下内容添加到您的routeMiddleware \ App \ Http \ Kernel.php中,以便您可以选择应该强制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,
];
接下来,我想确保两个基本组的登录/注册等以及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
});
确认您的中间件已从控制台正确应用于路由。
php artisan route:list
现在,您已经保护了应用程序的所有表单或敏感区域,现在的关键是使用视图模板来定义安全和公共(非https)链接。
根据以上示例,您将按以下方式呈现安全链接-
<a href="{{secure_url('/login')}}">Login</a>
<a href="{{secure_url('/signup')}}">SignUp</a>
非安全链接可以呈现为
<a href="{{url('/aboutus',[],false)}}">About US</a></li>
<a href="{{url('/promotion',[],false)}}">Get the deal now!</a></li>
这是呈现一个完全合格的URL,例如https:// yourhost / login 和http:// yourhost / aboutus
如果您未使用http渲染完全限定的URL,而是使用相对链接url('/ aboutus'),则在用户访问安全站点后https仍然存在。
希望这可以帮助!