내 첫 번째 Laravel 5 프로젝트에서 작업하고 있으며 내 앱에서 HTTPS를 강제하는 로직을 어디에 어떻게 배치해야하는지 모르겠습니다. 여기서 중요한 점은 앱을 가리키는 도메인이 많고 3 개 중 2 개만 SSL을 사용한다는 것입니다 (세 번째는 폴백 도메인, 긴 이야기). 그래서 .htaccess가 아닌 내 앱의 논리에서 이것을 처리하고 싶습니다.
Laravel 4.2에서는 다음 위치에있는이 코드로 리디렉션을 수행했습니다 filters.php
.
App::before(function($request)
{
if( ! Request::secure())
{
return Redirect::secure(Request::path());
}
});
나는 미들웨어가 이와 같은 것을 구현해야한다고 생각하지만 그것을 사용하여 이것을 알 수는 없습니다.
감사!
최신 정보
저처럼 Cloudflare를 사용하는 경우 제어판에 새 페이지 규칙을 추가하면됩니다.
답변
미들웨어 클래스로 작동하도록 만들 수 있습니다. 내가 당신에게 아이디어를 드리겠습니다.
namespace MyApp\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\App;
class HttpsProtocol {
public function handle($request, Closure $next)
{
if (!$request->secure() && App::environment() === 'production') {
return redirect()->secure($request->getRequestUri());
}
return $next($request);
}
}
그런 다음이 미들웨어를 다음 Kernel.php
과 같이 파일 에서 규칙 설정을 추가하는 모든 요청에 적용합니다 .
protected $middleware = [
'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode',
'Illuminate\Cookie\Middleware\EncryptCookies',
'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',
'Illuminate\Session\Middleware\StartSession',
'Illuminate\View\Middleware\ShareErrorsFromSession',
// appending custom middleware
'MyApp\Http\Middleware\HttpsProtocol'
];
위의 샘플에서 미들웨어는 다음과 같은 경우 모든 요청을 https로 리디렉션합니다.
- 현재 요청에는 보안 프로토콜 (http)이 없습니다.
- 환경이
production
. 따라서 기본 설정에 따라 설정을 조정하십시오.
Cloudflare
이 코드를 WildCard SSL이있는 프로덕션 환경에서 사용하고 있으며 코드가 올바르게 작동합니다. && App::environment() === 'production'
localhost에서 제거 하고 테스트하면 리디렉션도 작동합니다. 따라서 SSL이 설치되어 있는지 여부는 문제가되지 않습니다. Https 프로토콜로 리디렉션 되려면 Cloudflare 레이어에 매우 세심한주의를 기울여야 할 것 같습니다.
23/03/2015 수정
@Adam Link
의 제안 덕분에 Cloudflare가 전달하는 헤더 때문일 수 있습니다. CloudFlare는 HTTP를 통해 서버에 도달하고 HTTPS 요청을 전달 중임을 선언하는 X-Forwarded-Proto 헤더를 전달합니다. 미들웨어에 다음과 같은 다른 줄을 추가해야합니다.
$request->setTrustedProxies( [ $request->getClientIp() ] );
… CloudFlare가 보내는 헤더를 신뢰합니다. 이렇게하면 리디렉션 루프가 중지됩니다.
2016 년 9 월 27 일 수정-Laravel v5.3
미들웨어 클래스를 다음 web
그룹에 추가하면 됩니다 kernel.php file
.
protected $middlewareGroups = [
'web' => [
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
// here
\MyApp\Http\Middleware\HttpsProtocol::class
],
];
그 기억
web
설정할 필요가 없습니다 그룹은 기본적으로 모든 경로에 적용되는web
경로 나 컨트롤러에 명시 적으로.
2018/08/23 편집-Laravel v5.7
- 환경에 따라 요청을 리디렉션하려면
App::environment() === 'production'
. 이전 버전의 경우
env('APP_ENV') === 'production'
. \URL::forceScheme('https');
실제로 사용하면 리디렉션되지 않습니다.https://
웹 사이트가 렌더링되면 링크를 만듭니다 .
답변
나를 위해 일한 다른 옵션은 AppServiceProvider에서 다음 코드를 부팅 방법에 배치합니다.
\URL::forceScheme('https');
forceSchema ( ‘https’) 이전에 작성된 함수가 잘못되었습니다. forceScheme
답변
또는 Apache를 사용하는 경우 .htaccess
파일을 사용하여 URL이 https
접두사 를 사용하도록 할 수 있습니다 . Laravel 5.4에서 .htaccess
파일에 다음 줄을 추가 했으며 저에게 효과적 이었습니다.
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
답변
laravel 5.4의 경우이 형식을 사용하여 .htaccess 대신 https 리디렉션을 가져옵니다.
namespace App\Providers;
use Illuminate\Support\Facades\URL;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
URL::forceScheme('https');
}
}
답변
manix의 답변과 비슷하지만 한 곳에서. HTTPS를 강제하는 미들웨어
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class ForceHttps
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (!app()->environment('local')) {
// for Proxies
Request::setTrustedProxies([$request->getClientIp()]);
if (!$request->isSecure()) {
return redirect()->secure($request->getRequestUri());
}
}
return $next($request);
}
}
답변
이것은 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>
이것이하는 일은 https : // yourhost / login 및 http : // yourhost / aboutus 와 같은 정규화 된 URL을 렌더링하는 것입니다 .
http로 정규화 된 URL을 렌더링하지 않고 상대 링크 url ( ‘/ aboutus’)을 사용하는 경우 사용자가 보안 사이트를 방문한 후에도 https가 유지됩니다.
도움이 되었기를 바랍니다!
답변
.htaccess 파일을 사용하여 https 리디렉션을 수행하는 것은 어떻습니까? 이것은 프로젝트 루트 (공용 폴더가 아님)에 있어야합니다. 프로젝트 루트 디렉토리를 가리 키도록 서버를 구성해야합니다.
<IfModule mod_rewrite.c>
RewriteEngine On
# Force SSL
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Remove public folder form URL
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
나는 이것을 laravel 5.4 (이 답변을 쓰는 현재 최신 버전)에 사용하지만 laravel이 일부 기능을 변경하거나 제거하더라도 기능 버전에서 계속 작동해야합니다.
![](http://daplus.net/wp-content/uploads/2023/04/coupang_part-e1630022808943-2.png)