这是针对Laravel 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,所以没有必要这样做。
请将以下内容添加到 \App\Http\Kernel.php 的 routeMiddleware 中,这样您就可以选择哪个路由组应该强制使用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() {
Route::get('login', 'AuthController@showLogin');
Route::post('login', 'AuthController@doLogin');
Route::get('password/reset/{token}', 'Auth\PasswordController@getReset');
Route::post('password/reset', 'Auth\PasswordController@postReset');
});
Route::group(['middleware' => ['auth','forceSSL']], function()
{
Route::get('dashboard', function(){
return view('app.dashboard');
});
Route::get('logout', 'AuthController@doLogout');
});
请从控制台确认您的中间件是否正确应用于路由。
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会继续存在。
希望这可以帮助你!
$_SERVER['HTTP_HOST']
检测。 - NightMICU