![](/img/trans.png)
[英]Error with HTTPS for routes in Laravel 4.2 - assets load fine over HTTPS
[英]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\Request
有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);
}
因此,如果您的服務器未通過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.