15 ответов:
С помощью App::перед
вы могли бы воспользоваться
App::before()блок .измените блок, чтобы включить простую проверку, чтобы увидеть, если текущий запрос является безопасным, а если нет, перенаправить его.
App::before(function($request) { if( ! Request::secure()) { return Redirect::secure(Request::path()); } });С Помощью Фильтров
другой вариант может заключаться в создании такого фильтра. Люди обычно хранят это также в
app/filters.php.Route::filter('force.ssl', function() { if( ! Request::secure()) { return Redirect::secure(Request::path()); } });затем вы можете применить этот новый фильтр для любого из ваших маршрутов, групп маршрутов или контроллеров, подобных этому.
Индивидуальному Маршруту
Route::get('something', ['before' => 'force.ssl'], function() { return "This will be forced SSL"; });Группы По Маршруту
Route::group(['before' => 'force.ssl'], function() { // Routes here. });контроллер
вам нужно будет сделать это в контроллере
__construct()метод.public function __construct() { $this->beforeFilter('force.ssl'); }
другой ответ может заключаться в том, чтобы позволить вашему веб-серверу справиться с этим. Если вы используете Apache, вы можете использовать функцию RedirectSSL, чтобы убедиться, что все запросы идут на HTTPS-версию вашего сайта, а если нет, перенаправьте их. Это произойдет до того, как Ларавель даже получит запрос.
Если вы находитесь на NGINX, вы можете сделать это, имея два серверных блока. Один для обычного HTTPS на порту 80, а другой для HTTPS на порту 443. Затем настройте обычный серверный блок, чтобы всегда перенаправлять на версию ssl.
server { listen 80; server_name mydomain.com; rewrite ^ https://$server_name$request_uri? permanent; } server { listen 443; server_name mydomain.com; ssl on; # other server config stuff here. }Я бы лично пошел с этой опцией, так как сам PHP не должен ничего обрабатывать. Как правило, дешевле обрабатывать такую проверку на уровне веб-сервера.
для пользователей, использующих Laravel 4/5 и Elastic Beanstalk, форсирование HTTPS трудно использовать эти методы, потому что
isSecure()вернутсяfalse. Далее, используя.htaccessперенаправление приведет к циклу перенаправления для Chrome и времени задержки загрузки страницы в Firefox.Эта настройка предназначена для
- Laravel 5 и может работать на Laravel 3/4
- приложение загружается на Elastic Beanstalk под управлением экземпляров сервера EC2
- используется маршрут 53 для разрешения DNS
- Cloudfront используется для глобального CDN всех активов и применения HTTPS
- я бегу
awsна машине Windows. Linux может немного отличаться?после нескольких часов моих собственных попыток мне удалось получить все HTTP-запросы, перенаправленные на HTTPS, используя следующие шаги:
получить сертификат SSL. Гиды и поставщики многочисленны и могут быть найдены через Google поиск.
загрузите сертификат в AWS с помощью
awsкомандной консоли. Структура команды:aws iam upload-server-certificate --server-certificate-name CERTIFICATE_NAME --certificate-body "file://PATH_TO_CERTIFICATE.crt" --private-key "file://YOUR_PRIVATE_KEY.pem" --certificate-chain "file://YOUR_CERTIFICATE_CHAIN.ca-bundle" --path /cloudfront/создать приложение эластичный бобовый стебель. Пройдите через процесс установки. После установки приложения перейдите в раздел конфигурация ->Сетевой Уровень ->Балансировки Нагрузки и нажимаем кнопку шестерни значок.
выберите безопасный порт прослушивателя как 443. Выберите протокол как HTTPS. Выберите
CERTIFICATE_NAMEС Шаг 2 на идентификатор SSL-сертификата. Сохранить конфигурацию.иди к своему консоль. Нажмите инстансов EC2. Нажмите Балансировщики Нагрузки. Щелкните по балансировщикам нагрузки. Щелчок экземпляров и прокрутите вниз, чтобы увидеть экземпляры EC2, назначенные этому балансировщику нагрузки. Если экземпляр EC2 имеет то же имя, что и URL-адрес вашего приложения (или что-то близкое), обратите внимание на DNS Name для балансировки нагрузки. Он должен быть в формате
awseb-e-...возвращайся к своему консоль. Нажмите CloudFront. Нажмите Создать. Выберите Web распределение.
настройка дистрибутива. Установите свой Origin Доменное Имя к DNS-имени балансировщика нагрузки, которое вы нашли в Шаг 5. Установите Политика Протокола Просмотра до перенаправить HTTP на HTTPS. Набор Строки Прямого Запроса до да. Набор Альтернативные Доменные Имена (CNAMEs) к URL-адресам, которые вы хотите использовать для вашего приложения. Набор SSL Сертификат до
CERTIFICATE_NAMEвы загрузили в Шаг 2. Создайте свой дистрибутив.нажмите на имя вашего дистрибутива в CloudFront. Нажмите происхождение, выберите источник и нажмите Edit. Убедитесь, что ваш Политика Протокола Происхождения и Просмотр Матча. Вернуться. Нажмите поведение, выберите источник и нажмите Edit. Изменить вперед Заголовки до Белый и добавить Хоста. Спасать.
иди к своему консоль. Нажмите маршрут 53. Нажмите Ведущего Зон. Нажмите Создать Размещенную Зону. Настройка доменного имени. После настройки Нажмите кнопку Создать Набор Записей. Введите свою запись А. Выберите псевдоним как да. Ваш Псевдоним Target это ваш CloudFront распределение. Сохранить запись.
настройка серверов имен для вашего домена, чтобы указать на маршрут 53 серверов имен. Подождите, пока все размножится, что может занять несколько часов. Перейдите на свой URL-адрес. Вы будете автоматически перенаправлены на HTTPS.
но подождите, мои ссылки не идут на HTTPS!?- Ты должен справиться с
X-Forwarded-Protoзаголовок, который CloudFront пройдет. Для Laravel 4,следуйте этому руководству. Для Laravel 5, run это:php artisan make:middleware EB_SSL_Trustа затем добавьте это к
EB_SSL_Trustfile:public function handle($request, Closure $next) { $request->setTrustedProxies( [ $request->getClientIp() ] ); return $next($request); }и добавьте это к вашему
App\Http\Kernel.phpfile:protected $middleware = [ ... 'App\Http\Middleware\EB_SSL_Trust', ... ];Примечание: все ваши активы, такие как CSS, JS или изображения, должны быть отправлены по HTTPS. Если вы используете Laravel для создания этих ссылок, используйте
secure_asset()чтобы создать HTTPS URL в вашем представлении.
использование .htaccess Apache для laravel 4.2.X
Исходный Файл
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews </IfModule> RewriteEngine On # Redirect Trailing Slashes... RewriteRule ^(.*)/$ / [L,R=301] # Handle Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>редактировать файл / public/.htaccess
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews </IfModule> RewriteEngine On # Redirect Trailing Slashes... RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # Handle Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
использование фильтры был осужден в Laravel 5.1.* . Это идеальная работа для промежуточного программного обеспечения.
создать промежуточное ПО и в разделе дескриптор поставить
public function handle($request, Closure $next) { if(! $request->secure()) { return redirect()->secure($request->path()); } return $next($request); }затем просто зарегистрировать промежуточное программное обеспечение в ядре.php и использовать его с вашими маршрутами или контроллерами.
объединение предыдущих ответов и обновление для Laravel 4.2:
Route::filter('secure', function () { if (! Request::secure()) { return Redirect::secure( Request::path(), in_array(Request::getMethod(), ['POST', 'PUT', 'DELETE']) ? 307 : 302 ); } }); Route::when('*', 'secure');
Если вы хотите перенаправить на тот же URL, но с помощью https, вы должны использовать
Request::getRequestUri()вместоRequest::path():App::before(function($request) { if( ! Request::secure()) { return Redirect::secure(Request::getRequestUri()); } });
Если у вас есть проблема, где по какой-то причине
Request::secure()возвращает false, даже если url-адресhttps, это может быть потому, что значение $_SERVER['HTTPS'] не существует.Это решение:
App::before(function ($request){ // Force https if(!Request::secure() && array_get($_SERVER, 'SERVER_PORT') != 443){ return Redirect::secure(Request::path()); } });
у меня была проблема с принудительным ssl при выполнении запроса POST. Он всегда будет перенаправлять, чтобы получить. Это происходит потому, что
Redirect::secure()по умолчанию используется перенаправление 302.чтобы убедиться, что ваш почтовый запрос перенаправлен правильно, Используйте что-то вроде
return Redirect::secure("your/path/here", 307)Это позволит убедиться, что ваш запрос будет сохранять исходный метод запроса после перенаправления происходит.
Я не понимаю о HTTP и HTTPS в деталях, поэтому мне жаль, если этот ответ не очень хорош.
насколько я понимаю, есть проблема, что даже когда клиент и (указанный клиент) сервер используют HTTPS,
Request::secure()может возвращать false, потому что ваше приложение может работать на другом сервере, который, возможно, не получает запрос https.я размещаю свое приложение laravel в heroku, и кажется, что он это делает. Мой Угадай является ли основной (указанный клиентом) сервер балансировщиком нагрузки, и когда запрос пересылается, он поступает на другой сервер как обычный HTTP-запрос.
когда такая пересылка может произойти, вы не должны просто проверить
Request::secure()наtrue. Я был проинструктирован (кем-то в #laravel @ irc.freenode.com) чтобы также проверитьRequest::server('HTTP_X_FORWARDED_PROTO')чтобы увидеть, если она равна'https'.так что если вы намерены следовать другим советам здесь и выполните перенаправление в случае незащищенности, попробуйте проверить и этот параметр сервера.
для laravel 5.1 вы должны использовать данный код в
App\Http\Providers\RouteServiceProvider@boot$router->filter('force.ssl', function () { if ( ! request()->secure() ) { return redirect()->secure(request()->path()); } });теперь вы можете использовать это в файл маршрутов.
Route::group(['before' => 'force.ssl'], function () { // Routes here });вы также можете добавить
['before' => 'force.ssl']на$router->group()наApp\Http\Providers\RouteServiceProvider@map
это работает для меня в Apache 2.4
я изменилась .htaccess в корневой папке Laravel
от
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^(.*)$ public/ [L] </IfModule>To
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteRule ^(.*)$ public/ [L] </IfModule>
если за прокси и запрос:: secure () не работает.
App::before( function( $request ) { // set the current IP (REMOTE_ADDR) as a trusted proxy Request::setTrustedProxies( [ $request->getClientIp() ] ); });
объединение предыдущих ответов для использования констант и методов, доступных в Laravel 4.2.
маршруты.php
Route::when('*', 'secure');фильтры.php
use Illuminate\Http\Response as IlluminateResponse; Route::filter('secure', function () { if ( ! Request::secure() && Request::getPort() != 443) { return Redirect::secure( Request::path(), in_array(Request::getMethod(), ['POST', 'PUT', 'DELETE']) ? IlluminateResponse::HTTP_TEMPORARY_REDIRECT : IlluminateResponse::HTTP_FOUND ); } });
Если вам нужно использовать Laravel 4 для обработки перенаправления (как и я), я бы пошел на следующую настройку (объяснение в виде комментариев в коде):
фильтр маршруту:
// app/filters.php Route::filter('ssl.force', function() { if(App::environment('production') && !Request::secure()) { // don't set a session cookie when redirecting to another scheme to // avoid dropping the session when switching scheme Config::set('session.driver', 'array'); // preserve query string while redirecting by using fullUrl() // instead of Redirect::secure + Request::path() $url = str_replace('http://', 'https://', Request::fullUrl()); return Redirect::to($url, 302, array(), true); } // secure cookies for https Config::set('session.secure', Request::secure()); });затем примените фильтр в качестве фильтра перед вашим маршрутом или группой маршрутов. например:
// app/routes.php Route::group(array('before' => 'ssl.force'), function () { // SSL routes });
Comments