Загрузить ресурсы Blade с https в Laravel
Я загружаю свой css, используя этот формат: <link href="{{ asset('assets/mdi/css/materialdesignicons.min.css') }}" media="all" rel="stylesheet" type="text/css" />
и он загружается отлично для всех HTTP-запросов.
Но когда я загружаю свою страницу входа в систему с помощью SSL (https), я получаю ...page... was loaded over HTTPS, but requested an insecure stylesheet 'http...
Может кто-нибудь, пожалуйста, скажите мне, как мне сделать блейд-ресурсы на https вместо http?
Должен ли я пытаться безопасно загружать активы? Или это не работа Blade?
Ответы
Ответ 1
Я считаю, что secure_asset - это то, что вы ищете.
<link href="{{ secure_asset('assets/mdi/css/materialdesignicons.min.css') }}" media="all" rel="stylesheet" type="text/css" />
15/15/2018 Редактировать: Хотя мой ответ касается непосредственно вопроса, он несколько устарел с учетом того, что Laravel может сделать в настоящее время; могут быть случаи, когда вы хотите использовать HTTPS в определенных средах, но не в других.
См. ответ скофилда ниже, чтобы найти более гибкое решение для таких случаев.
Ответ 2
У меня была проблема с функцией asset
, когда она загружала ресурсы по протоколу HTTP, когда веб-сайт использовал HTTPS, что вызывало проблему "Смешанное содержимое".
Чтобы это исправить, вам нужно добавить \URL::forceScheme('https')
в ваш файл AppServiceProvider
.
Итак, моя выглядит так (Laravel 5.4):
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
if(config('app.env') === 'production') {
\URL::forceScheme('https');
}
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}
Это полезно, когда вам нужен https только на сервере (config('app.env') === 'production'
), а не локально, поэтому не нужно заставлять функцию asset
использовать https.
Ответ 3
Я использую ответ @Scofield с помощью \URL::forceScheme('https');
. Это решение также работало для показа https для всех маршрутов , но у меня это не сработало для $request-> url(), где вместо http https отображается http:
поэтому я использовал $this->app['request']->server->set('HTTPS', true);
вместо \URL::forceScheme('https');
Я использую Laravel 5.4 и обновляю файл .env и appserviceproviders
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
use Log;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*
*/
public function boot()
{
If (env('APP_ENV') !== 'local') {
$this->app['request']->server->set('HTTPS', true);
}
Schema::defaultStringLength(191);
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}
в моем файле env я изменил
APP_ENV=local to APP_ENV=development
APP_ENV = local для localhost
APP_ENV = разработка/производство для на рабочем сервере
после изменения env запустите эту команду ремесленника
php artisan config:clear
Надеюсь, это поможет :-)
Ответ 4
Другой подход состоял бы в том, чтобы передать true
в качестве второго параметра.
/**
* Generate an asset path for the application.
*
* @param string $path
* @param bool $secure
* @return string
*/
function asset($path, $secure = null)
{
return app('url')->asset($path, $secure);
}
Как вы видите ниже secure_asset
просто вызывает asset
со вторым параметром true
.
/**
* Generate an asset path for the application.
*
* @param string $path
* @return string
*/
function secure_asset($path)
{
return asset($path, true);
}
Ответ 5
Проблема в том, что на моих локальных машинах работает cloudflare, но онлайн-сервер не является решением
public function boot()
{
if (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
\URL::forceScheme('https');
}
}
Ответ 6
Вот моя конфигурация для работы HTTPS с активами. Чтобы включить это в производство, добавьте REDIRECT_HTTPS = true в файл .env.
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
if(env('REDIRECT_HTTPS'))
{
\URL::forceScheme('https');
}
Schema::defaultStringLength(191);
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}
Ответ 7
Выяснить, является ли текущий Request
безопасным или нет, не должно быть вашим решением. В основе Symfony\Component\HttpFoundation\Request
есть метод isSecure
, который Laravel использует внутри.
public function isSecure()
{
if ($this->isFromTrustedProxy() && $proto = $this->getTrustedValues(self::HEADER_X_FORWARDED_PROTO)) {
return \in_array(strtolower($proto[0]), array('https', 'on', 'ssl', '1'), true);
}
$https = $this->server->get('HTTPS');
return !empty($https) && 'off' !== strtolower($https);
}
Поэтому, если ваш сервер не передает заголовок HTTPS
с On
, он должен передавать X-FORWARDED-PROTO
и должен быть разрешен вашим промежуточным программным обеспечением TrustProxies
.
Если вы используете обратный прокси-сервер, вы должны узнать свой IP-адрес прохода через прокси-сервер - вы можете легко это сделать, получив переменную $_SERVER['REMOTE_ADDR']
и установив IP-адрес вашего промежуточного ПО TrustProxies
:
/**
* The trusted proxies for this application.
*
* @var array
*/
protected $proxies = [
'123.123.123.123',
];
Laravel (Symfony) автоматически обнаружит, безопасен ли Request
или нет, и соответствующим образом выберет протокол.