Загрузить ресурсы 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 или нет, и соответствующим образом выберет протокол.