次の形式を使用して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の仕事ではありませんか?
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の回答を参照 これらの種類のケースをカバーするより柔軟なソリューションについては。
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を使用するように強制する必要はありません。
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
それが役に立てば幸い :-)
別のアプローチは、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番目のパラメーターasset
でtrue
を呼び出します。
/**
* Generate an asset path for the application.
*
* @param string $path
* @return string
*/
function secure_asset($path)
{
return asset($path, true);
}
問題は、ローカルマシンの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()
{
//
}
}
現在の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
が安全かどうかを自動的に検出し、それに応じてプロトコルを選択します。