簡體   English   中英

在 Laravel 中加載 https 的 Blade 資產

[英]Load Blade assets with https in 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 的工作?

當網站使用 HTTPS 時, asset功能通過 HTTP 協議加載資源時出現問題,導致“混合內容”問題。

要解決這個問題,您需要將\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()
    {
        //
    }
}

當您僅在服務器( config('app.env') === 'production' )上而不是在本地需要 https 時,這很有用,因此不需要強制asset功能使用 https。

我相信secure_asset是您要找的東西。

<link href="{{ secure_asset('assets/mdi/css/materialdesignicons.min.css') }}" media="all" rel="stylesheet" type="text/css" />

5/15/2018 編輯:雖然我的回答直接解決了這個問題,但考慮到 Laravel 如今可以做的事情,它有點過時了; 在某些情況下,您可能希望在某些環境中強制使用 HTTPS,但在其他環境中不強制使用。

有關涵蓋此類情況的更靈活的解決方案, 請參閱下面的 Scofield 的回答

08/11/2020 編輯:說真的,伙計們, 斯科菲爾德的答案比我的好,將為不同的環境提供更大的靈活性。 給他你的updoots。

我通過使用\URL::forceScheme('https');使用@Scofield 回答該解決方案還可以為所有路由顯示 https但這對我不起作用 $request->url() 它顯示 http 而不是 https

所以我用$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 for localhost APP_ENV=development/production for on working server

更改 env 后運行此 artisan 命令

php artisan config:clear

希望能幫助到你:-)

有一個環境變量“ASSET_URL”,您可以在其中使用 http 或 https 放置您的應用程序 url

ASSET_URL=https://your.app.url #for production

要么

ASSET_URL=http://your.app.url #for local development

另一種方法是將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只是使用第二個參數true調用asset

/**
 * Generate an asset path for the application.
 *
 * @param  string  $path
 * @return string
 */
function secure_asset($path)
{
    return asset($path, true);
}

確定當前Request是否安全不應該由您決定。 底層Symfony\Component\HttpFoundation\RequestisSecure方法。

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);
}

因此,如果您的服務器未通過On傳遞HTTPS標頭,則它應該傳遞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是否安全並相應地選擇協議。

問題是我本地機器上的 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');
        }
    }

這是我使 HTTPS 與資產一起工作的配置。 要在生產中啟用此功能,請在 .env 文件中添加 REDIRECT_HTTPS=true。

<?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()
    {
        //
    }
}

我最終將其放入我的刀片文件中:

@if(parse_url(url('/'), PHP_URL_SCHEME) == 'HTTPS')
    <link rel="stylesheet" href="{{ secure_asset('assets/css/slider.css') }}">
    <link rel="stylesheet" href="{{ secure_asset('assets/css/dropdown.css') }}">
@else
    <link rel="stylesheet" href="{{ asset('assets/css/slider.css') }}">
    <link rel="stylesheet" href="{{ asset('assets/css/dropdown.css') }}">
@endif

在將 Laravel 版本從 5.4 升級到 5.5 時,我遇到了同樣的問題。

只需添加\URL::forceScheme('https'); 在 app/Providers/AppServiceProvider.php 中。 有效。

<?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()
    {
        \URL::forceScheme('https');
    }
...

而不是"{{ asset('assets/mdi/css/materialdesignicons.min.css') }}"使用"{{ secure_asset('assets/mdi/css/materialdesignicons.min.css') }}"

進一步改進上面同事Paulo Gabriel的答案,該答案應該被接受為答案,因為它非常實用,如果您的APP_URL已經包含https:// ,則在 .env 文件中插入此配置:

ASSET_URL="${APP_URL}"

in.env 文件請將本地值更改為生產

APP_ENV=production

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM