76

我正在使用这种格式加载我的 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 的工作?

4

11 回答 11

204

asset当网站使用 HTTPS 时,通过 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。

于 2017-08-17T09:35:50.800 回答
83

我相信secure_asset是您正在寻找的。

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

2018 年5 月 15 日编辑:虽然我的回答直接解决了这个问题,但考虑到 Laravel 现在可以做什么,这有点过时了;在某些情况下,您可能希望在某些环境中强制使用 HTTPS,但在其他环境中不强制使用 HTTPS。

有关此类情况的更灵活解决方案,请参见下面的 Scofield 答案。

2020 年 8 月 11 日编辑:说真的,斯科菲尔德的答案比我的要好,并且将为不同的环境提供更大的灵活性。给他你的updoots。

于 2015-12-20T05:05:06.537 回答
32

我使用@Scofield 回答使用\URL::forceScheme('https');这个解决方案也可以为所有路由显示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()
    {
        //
    }
}

在我的环境文件中我已经改变了

APP_ENV=local to APP_ENV=development

APP_ENV=本地,用于本地 APP_ENV=开发/生产,用于工作服务器

更改环境后运行此工匠命令

php artisan config:clear

希望能帮助到你 :-)

于 2018-01-17T09:47:58.860 回答
14

有一个环境变量“ASSET_URL”,您可以在其中使用 http 或 https 放置您的应用程序 url

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

或者

ASSET_URL=http://your.app.url #for local development
于 2021-07-07T13:54:36.010 回答
12

另一种方法是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);
}
于 2015-12-20T05:41:20.177 回答
9

弄清楚电流Request是否安全不应该是您的决定。底层Symfony\Component\HttpFoundation\RequestisSecureLaravel 内部使用的方法。

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是否安全并相应地选择协议。

于 2018-08-28T02:18:23.750 回答
8

问题是我本地机器上的 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');
        }
    }
于 2018-09-28T09:57:32.723 回答
6

这是使 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()
    {
        //
    }
}
于 2017-09-20T12:15:25.827 回答
0

在将 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');
    }
...
于 2020-05-14T18:52:57.987 回答
0

我最终把它放在我的刀片文件中:

@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
于 2019-11-20T09:09:09.497 回答
-1

在 .env 文件中,请将本地值更改为生产

APP_ENV=production
于 2021-09-25T07:13:56.653 回答