这适用于 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 将在用户访问安全站点后持续存在。
希望这会有所帮助!