web-dev-qa-db-ja.com

https Laravel

次の形式を使用してcssをロードしています:<link href="{{ asset('assets/mdi/css/materialdesignicons.min.css') }}" media="all" rel="stylesheet" type="text/css" />

しかし、SSL(https)でログインページを読み込むと、...page... was loaded over HTTPS, but requested an insecure stylesheet 'http...

誰かがhttpではなくhttps経由でブレードロードアセットを作成する方法を教えてもらえますか?

アセットを安全にロードする必要がありますか?それともBladeの仕事ではありませんか?

27
Artur Grigio

secure_asset があなたが探しているものだと思います。

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

5/15/2018編集:私の答えは質問を直接扱っていますが、Laravel can最近では、特定の環境ではHTTPSを強制し、他の環境では強制しない場合があります。

以下のScofieldの回答を参照 これらの種類のケースをカバーするより柔軟なソリューションについては。

46
maiorano84

WebサイトがHTTPSを使用しているときにHTTPプロトコルを介してリソースをロードすると、asset関数で問題が発生し、「混合コンテンツ」問題が発生しました。

これを修正するには、AppServiceProviderファイルに\URL::forceScheme('https')を追加する必要があります。

だから私のものは次のようになります(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を使用するように強制する必要はありません。

66
Scofield

Use \URL::forceScheme('https');を使用して@Scofield answerを使用します。このソリューションは、すべてのルートでhttpsを表示するようにも機能しましたが、$ request-> url() 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 = localhostのローカルAPP_ENV = development/production for working server

envを変更した後、この職人コマンドを実行します

php artisan config:clear

それが役に立てば幸い :-)

12
Abdul Rehman

別のアプローチは、trueを2番目のパラメーターとして渡すことです。

/**
 * 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は、単に2番目のパラメーターassettrueを呼び出します。

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

問題は、ローカルマシンの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');
        }
    }
3
Goran Siriev

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

現在のRequestが安全かどうかを判断することは、あなたの決定ではありません。基になるSymfony\Component\HttpFoundation\Requestには、Laravelが内部的に使用するisSecureメソッドがあります。

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が安全かどうかを自動的に検出し、それに応じてプロトコルを選択します。

1
falnyr