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?
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.
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.
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 :-)
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);
}
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');
}
}
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.