繁体   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