Работаю над своим первым проектом Laravel 5 и не знаю, где и как разместить логику для принудительного использования HTTPS в моем приложении. Решающим аргументом здесь является то, что существует множество доменов, указывающих на приложение, и только два из трех используют SSL (третий - резервный домен, долгая история). Поэтому я бы хотел обработать это в логике моего приложения, а не в .htaccess.
В Laravel 4.2 я выполнил перенаправление с помощью этого кода, расположенного в filters.php
:
App::before(function($request)
{
if( ! Request::secure())
{
return Redirect::secure(Request::path());
}
});
Я думаю, что в промежуточном программном обеспечении должно быть реализовано что-то подобное, но я не могу понять это, используя его.
Спасибо!
ОБНОВИТЬ
Если вы используете Cloudflare, как и я, это можно сделать, добавив новое правило страницы в панель управления.
источник
$_SERVER['HTTP_HOST']
Ответы:
Вы можете заставить его работать с классом Middleware. Позвольте мне дать вам идею.
Затем примените это промежуточное программное обеспечение к каждому запросу, добавляя установку правила в
Kernel.php
файл, например:В примере выше промежуточное ПО будет перенаправлять каждый запрос на https, если:
production
. Итак, просто отрегулируйте настройки в соответствии со своими предпочтениями.Cloudflare
Я использую этот код в производственной среде с WildCard SSL, и код работает правильно. Если я удалю
&& App::environment() === 'production'
и протестирую его на localhost, перенаправление также будет работать. Итак, наличие или отсутствие установленного SSL - не проблема. Похоже, вам нужно очень внимательно следить за слоем Cloudflare, чтобы вас перенаправили на протокол Https.Изменить 23/03/2015
Благодаря
@Adam Link
предложению: вероятно, это вызвано заголовками, которые передает Cloudflare. CloudFlare, вероятно, попадает на ваш сервер через HTTP и передает заголовок X-Forwarded-Proto, который объявляет, что он пересылает запрос HTTPS. Вам нужно добавить еще одну строку в ваше промежуточное ПО, в которой говорится ...... доверять заголовкам, которые отправляет CloudFlare. Это остановит цикл перенаправления
Изменить 27/09/2016 - Laravel v5.3
Просто нужно добавить класс промежуточного программного обеспечения в
web
группу вkernel.php file
:Изменить 23.08.2018 - Laravel v5.7
App::environment() === 'production'
. Для предыдущей версии былоenv('APP_ENV') === 'production'
.\URL::forceScheme('https');
фактически не перенаправляет. Он просто создает ссылкиhttps://
после отображения веб-сайта.источник
$request->setTrustedProxies( [ $request->getClientIp() ] );
нужно доверять заголовкам, которые отправляет CloudFlare. Это остановит цикл перенаправления.return redirect()->secure($request->getRequestUri(), 301);
$request->server('HTTP_X_FORWARDED_PROTO') != 'https'
для меня это работаетДругой вариант, который сработал для меня, в AppServiceProvider поместите этот код в метод загрузки:
Функция, написанная до forceSchema ('https'), была неправильной, ее forceScheme
источник
\URL::forceScheme('https');
if($this->app->environment() === 'production'){ $this->app['request']->server->set('HTTPS', true); }
\URL::forceScheme('https')
В качестве альтернативы, если вы используете Apache, вы можете использовать
.htaccess
файл, чтобы заставить свои URL-адреса использоватьhttps
префикс. В Laravel 5.4 я добавил в свой.htaccess
файл следующие строки, и у меня это сработало.источник
RewriteCond %{HTTP_HOST} !=localhost
на dev, чтобы обойти это.для laravel 5.4 используйте этот формат, чтобы получить перенаправление https вместо .htaccess
источник
Подобно ответу Manix, но в одном месте. ПО промежуточного слоя для принудительного использования HTTPS
источник
Это для Larave 5.2.x и выше. Если вы хотите иметь возможность обслуживать один контент по HTTPS, а другой по HTTP, вот решение, которое сработало для меня. Вы можете задаться вопросом, зачем кому-то предоставлять только некоторый контент по HTTPS? Почему бы не обслуживать все по HTTPS?
Хотя обслуживание всего сайта через HTTPS совершенно нормально, отключение всего через HTTPS вызывает дополнительные накладные расходы на вашем сервере. Помните, что шифрование обходится недешево. Небольшие накладные расходы также влияют на время отклика вашего приложения. Вы можете возразить, что обычное оборудование дешево и влияние незначительно, но я отвлекся :) Мне не нравится идея обслуживания больших страниц маркетингового контента с изображениями и т. Д. Через https. Итак, поехали. Это похоже на то, что другие предлагают выше с использованием промежуточного программного обеспечения, но это полное решение, которое позволяет вам переключаться между HTTP / HTTPS.
Сначала создайте промежуточное ПО.
Вот как должно выглядеть ваше промежуточное ПО.
Обратите внимание, что я не фильтрую на основе среды, потому что у меня есть настройка HTTPS как для локального разработчика, так и для производства, поэтому в этом нет необходимости.
Добавьте следующее в свой routeMiddleware \ App \ Http \ Kernel.php, чтобы вы могли выбрать, какая группа маршрутов должна принудительно использовать SSL.
Затем я хотел бы защитить две основные группы входа / регистрации и т. Д. И все остальное, стоящее за промежуточным ПО Auth.
Убедитесь, что ваше промежуточное ПО правильно применяется к вашим маршрутам с консоли.
Теперь вы защитили все формы или конфиденциальные области вашего приложения, и теперь ключевым моментом является использование вашего шаблона представления для определения ваших безопасных и общедоступных (не https) ссылок.
На основе приведенного выше примера вы должны отобразить свои защищенные ссылки следующим образом:
Небезопасные ссылки могут отображаться как
Это отображает полный URL-адрес, такой как https: // yourhost / login и http: // yourhost / aboutus.
Если вы не отображали полностью определенный URL-адрес с http и использовали относительный URL-адрес ссылки ('/ aboutus'), тогда https будет сохраняться после посещения пользователем защищенного сайта.
Надеюсь это поможет!
источник
А как насчет использования файла .htaccess для перенаправления https? Его следует поместить в корень проекта (а не в общую папку). Ваш сервер должен быть настроен так, чтобы указывать на корневой каталог проекта.
Я использую это для laravel 5.4 (последняя версия на момент написания этого ответа), но он должен продолжать работать для версий функций, даже если laravel изменит или удалит некоторые функции.
источник
RewriteCond %{HTTP_HOST} productiondomain\.com$ [NC]
Вы можете использовать RewriteRule для принудительного использования ssl в .htaccess в той же папке, что и ваш index.php.
Пожалуйста, добавьте как прикрепленное изображение, добавьте его перед всеми другими правилами
источник
Я добавляю эту альтернативу, так как я много страдал от этой проблемы. Я перепробовал все по-разному, но ничего не вышло. Итак, я придумал обходной путь. Возможно, это не лучшее решение, но оно работает -
production <- его следует заменить значением APP_ENV в вашем файле .env.
источник
в IndexController.php положить
в AppServiceProvider.php поставить
}
В AppServiceProvider.php каждое перенаправление будет переходить на URL-адрес https, а для HTTP-запроса нам нужно перенаправить один раз, поэтому в IndexController.php нам нужно сделать один раз перенаправление
источник
Приведенные выше ответы не сработали для меня, но похоже, что Дениз Туран переписал .htaccess таким образом, чтобы он работал с балансировщиком нагрузки Heroku здесь: https://www.jcore.com/2017/01/29/force-https -он-Heroku-помощь-Htaccess /
источник
Вот как это сделать на Heroku
Чтобы принудительно использовать SSL на ваших дино, но не локально, добавьте в конец вашего .htaccess в public /:
Вы можете проверить это на своем локальном компьютере с помощью:
Это устанавливает заголовок X-forwarded в форму, которую он примет на heroku.
т.е. он имитирует то, как дино heroku увидит запрос.
Вы получите этот ответ на своем локальном компьютере:
Это перенаправление. Это то, что heroku вернет клиенту, если вы установите .htaccess, как указано выше. Но этого не происходит на вашем локальном компьютере, потому что X-forwarded не будет установлен (мы подделали это с помощью curl выше, чтобы увидеть, что происходит).
источник
Если вы используете CloudFlare, вы можете просто создать правило страницы, чтобы всегда использовать HTTPS: это перенаправит каждый запрос http: // на https: //
В дополнение к этому вам также нужно будет добавить что-то подобное в свою функцию \ app \ Providers \ AppServiceProvider.php boot ():
Это гарантирует, что каждая ссылка / путь в вашем приложении использует https: // вместо http: //.
источник
Немного другой подход, протестирован в Laravel 5.7
PS. Код обновлен на основе комментариев @ matthias-lill.
источник
config('app.url')
Вместо этого он должен указывать на . Кроме того, в Laravel есть очень удобная строковая функцияStr::startsWith(config('app.url'), 'https://')
.Для Laravel 5.6 мне пришлось немного изменить условие, чтобы оно работало.
из:
Для того, чтобы:
источник
Это сработало для меня. Я сделал собственный код php, чтобы принудительно перенаправить его на https. Просто включите этот код в header.php
источник
Я использую в Laravel 5.6.28 следующее промежуточное ПО:
источник
Самый простой способ - на уровне приложения. В файле
добавить следующее:
и в методе boot () добавьте следующее:
Это должно перенаправить все запросы на https на уровне приложения.
(Примечание: это было протестировано с laravel 5.5 LTS)
источник
Вы можете просто перейти в app -> Providers -> AppServiceProvider.php
добавить две строки
используйте Illuminate \ Support \ Facades \ URL;
URL :: forceScheme ( 'HTTPS');
как показано в следующих кодах:
источник
Для меня это работает в Laravel 7.x за 3 простых шага с использованием промежуточного программного обеспечения:
1) Создайте промежуточное ПО с помощью команды
php artisan make:middleware ForceSSL
Промежуточное
2) Зарегистрируйте промежуточное ПО
routeMiddleware
внутри файла ядра.ядро
3) Используйте его в своих маршрутах
Маршруты
здесь полная документация по промежуточному программному обеспечению
========================
.HTACCESS Метод
Если вы предпочитаете использовать
.htaccess
файл, вы можете использовать следующий код:С уважением!
источник