web-dev-qa-db-fra.com

Charger les ressources Blade avec https dans Laravel

Je charge mon css en utilisant ce format: <link href="{{ asset('assets/mdi/css/materialdesignicons.min.css') }}" media="all" rel="stylesheet" type="text/css" /> et il se charge bien pour toutes les requêtes http

Mais lorsque je charge ma page de connexion avec SSL (https), j'obtiens un ...page... was loaded over HTTPS, but requested an insecure stylesheet 'http...

Quelqu'un peut-il me dire comment créer des ressources de chargement de lame via https au lieu de http?

Dois-je essayer de charger les actifs en toute sécurité? Ou n'est-ce pas le travail de Blade?

27
Artur Grigio

Je crois que secure_asset est ce que vous recherchez.

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

15/05/2018 Edit: Alors que ma réponse répond directement à la question, elle est un peu datée compte tenu de ce que Laravel can faites de nos jours; il peut y avoir des cas où vous souhaitez forcer HTTPS sur certains environnements mais pas sur d'autres.

Voir la réponse de Scofield ci-dessous pour une solution plus flexible pour couvrir ces types de cas.

46
maiorano84

J'ai rencontré un problème avec la fonction asset lorsqu'elle est chargée de ressources via le protocole HTTP lorsque le site Web utilisait HTTPS, ce qui est à l'origine du problème "Contenu mixte".

Pour résoudre ce problème, vous devez ajouter \URL::forceScheme('https') dans votre fichier AppServiceProvider.

Donc le mien ressemble à ça (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()
    {
        //
    }
}

Ceci est utile lorsque vous avez besoin de https uniquement sur le serveur (config('app.env') === 'production') et non localement, donc vous n'avez pas besoin de forcer la fonction asset pour utiliser https.

66
Scofield

J'utilise @Scofield answer en utilisant \URL::forceScheme('https'); Cette solution a également fonctionné pour afficher https pour toutes les routes mais cela n'a pas fonctionné pour moi pour $ request-> url () elle affiche http au lieu de https =

j'ai donc utilisé $this->app['request']->server->set('HTTPS', true); au lieu de \URL::forceScheme('https');

J'utilise Laravel 5.4 et je mets à jour . Fichier env et 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()
    {
        //
    }
}

dans mon fichier env, j'ai changé

APP_ENV=local to APP_ENV=development

APP_ENV = local pour localhost APP_ENV = développement/production pour sur le serveur de travail

après avoir changé env exécuter cette commande artisanale

php artisan config:clear

J'espère que ça aide :-)

12
Abdul Rehman

Une autre approche serait de passer true comme deuxième paramètre.

/**
 * 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);
}

Comme vous le voyez ci-dessous secure_asset appelle simplement asset avec le deuxième paramètre true.

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

Le problème est que Cloudflare sur mes machines locales fonctionne correctement, mais la solution du serveur en ligne n'est pas

 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

Voici ma configuration pour que HTTPS fonctionne avec les actifs. Pour l'activer en production, ajoutez REDIRECT_HTTPS = true dans le fichier .env.

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

Déterminer si le Request actuel est sécurisé ou non ne devrait pas être votre décision. Sous-jacent Symfony\Component\HttpFoundation\Request a isSecure méthode que Laravel utilise en interne.

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);
}

Donc, si votre serveur ne transmet pas l'en-tête HTTPS avec On, il doit transmettre X-FORWARDED-PROTO et doit être autorisé par votre middleware TrustProxies.

Si vous êtes derrière le proxy inverse, vous devriez découvrir votre IP de proxy - vous pouvez le faire facilement en obtenant le $_SERVER['REMOTE_ADDR'] variable et définissant l'IP de votre TrustProxies middleware:

/**
 * The trusted proxies for this application.
 *
 * @var array
 */
protected $proxies = [
    '123.123.123.123',
];

Laravel (Symfony) détectera alors automatiquement si le Request est sécurisé ou non et choisira le protocole en conséquence.

1
falnyr