Laravel génère une URL https sécurisée à partir de la route

Je ne peux pas vraiment trouver un moyen de générer une URL sécurisée à partir du nom de la route.

pour obtenir une URL complète, j'utilise

echo route('my_route_name');

Mais Que faire si je veux une URL avec https?

23
demandé sur Mārtiņš Briedis 2014-06-26 13:01:45

11 réponses

mise à jour: comme indiqué dans les commentaires, une façon plus simple de le faire serait d'ajouter URL::forceSchema('https'); pour la version Laravel entre 4.2-5.3 ou URL::forceScheme('https'); pour la version 5.4+boot méthode AppServiceProvider fichier.

ancienne réponse:

c'est en fait tout à fait possible et il n'y a qu'une seule ligne de code nécessaire pour accomplir cela.

Laravel ne vérifie pas la présence de SSL par elle-même, cela dépend de Symfony. Et il y va de notre clé pour faire croire que la demande actuelle est sécurisé.

la chose est, nous devons mettre le HTTPSserver param true, la méthode la plus simple est de coller le code suivant dans la balise boot méthode AppServiceProvider:

$this->app['request']->server->set('HTTPS', true);

dans mon cas précis, je n'ai besoin que de forcer la production de SSL, l'env local devrait quand même travailler sur http. C'est de cette façon-je forcer le SSL uniquement sur la production:

$this->app['request']->server->set('HTTPS', $this->app->environment() != 'local');

au fait, pensez à ces termes, vous pourriez en avoir besoin avenir.

44
répondu Ionut Bajescu 2017-10-11 22:25:10

en fait, il s'avère que laravel ne se soucie pas de savoir si url est sécurisée ou non, car il génère en fonction de l'url actuelle. Si vous êtes sur la page https,route() renvoie une url sécurisée. Si sur http, puis http:// url

le problème, C'est que Laravel n'a pas détecté que https était activé, ce qui était dû à une mauvaise configuration du serveur.

vous pouvez vérifier si Laravel voit la connexion actuelle comme https en appelant Request::isSecure();

7
répondu Mārtiņš Briedis 2014-09-12 11:15:39

je pense qu'il y a une seule façon de le faire.

Pour générer l'URL sécurisée de vos routes nommées, vous pouvez passer votre route dans le secure_url fonction d'assistance.

secure_url(URL::route('your_route_name', [], false));

Vous ne pouvez pas vraiment utiliser le route fonction helper car elle génère une URL absolue (avec http:// par défaut, et c'est httphttps la version que tu voulais

5
répondu Oni 2014-06-26 09:19:34

Laravel 5.x générera une URL sécurisée via l'Assistant route () s'il détecte que la connexion entrante est sécurisée. Le problème survient généralement si l'application est cachée derrière load balancer ou proxy (par exemple Cloudflare) car la connexion entre le serveur app et load balancer/proxy pourrait ne pas être sécurisée.

J'utilise maintenant Laravel Forge + Cloudflare et c'est la façon la plus facile que j'ai pu trouver pour activer l'application en pensant que la connexion entrante est sécurisée (pas sûr d'autres proxy.)

  1. Générer un certificat auto-signé (voir https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs ou http://www.selfsignedcertificate.com/)

  2. dans le panneau de Forge, insérez votre clé privée et votre certificat via Sites > your-site > SSL Certificates > Install Existing Certificate.

  3. Activer

  4. Dans CloudFlare panneau, Crypto > SSL, choisissez "Plein" (pas strict)

  5. Terminé (il faudra quelques minutes pour que le changement se propage)

en bref, la connexion entre client et Cloudflare est sécurisée par le propre SSL de Cloudflare. La connexion entre le serveur d'app et Cloudflare est protégée via votre cert généré (l'application considère donc la 'connexion' comme sécurisée).

Vous pouvez appliquer le même principe avec les autres piles.

5
répondu Aditya 2016-01-29 04:19:08

Utiliser secure_url:

secure_url(URL::route('your_route_name', [], false));

vous aurez besoin de définir URL::route to false afin de ne pas retourner une URL complète. Ensuite, la fonction secure_url génère une URL HTTPS entièrement qualifiée pour le chemin donné.

à partir de L'interface du générateur D'URL, vous pouvez utiliser URL:: route

string route(string $name, mixed $parameters = array(), bool $absolute = true)

Get the URL to a named route.
Parameters
string  $name   
mixed   $parameters     
bool    $absolute   
Return Value
string

https://laravel.com/api/5.4/Illuminate/Contracts/Routing/UrlGenerator.html

2
répondu PHPGrandMaster 2017-06-09 03:06:24

dans la plupart des cas, les routes doivent être générées avec le même schéma que celui avec lequel votre site a été chargé. Laravel détecte automatiquement si request a X-Forwarded-Proto en-tête et l'utilise pour décider quel schéma utiliser dans les URLs de route générées. Si votre site est derrière le mandataire inversé, alors vous devez ajouter l'adresse IP du mandataire inversé à la liste des mandataires de confiance. https://github.com/fideloper/TrustedProxy paquet d'aide pour ce faire. inclus dans Laravel 5.5. Par exemple, mon config/trustedproxy.php regarde comme:

<?php

return [
    'proxies' => '*',

    'headers' => [
    ]
];

je l'utilise avec nginx reverse proxy qui a la configuration suivante:

server {
  listen 80;
  server_name example.com; 
  access_log  /var/log/nginx/example.com_access.log;
  error_log   /var/log/nginx/example.com_error.log;

  client_max_body_size 50m;

  location / {
    proxy_pass              http://localhost:8002;
    proxy_set_header        Host $host;
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header        X-Forwarded-Proto $scheme;
  }

  listen 443 ssl;
  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
  include /etc/letsencrypt/options-ssl-nginx.conf;
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;


  if ($scheme != "https") {
    return 301 https://$host$request_uri;
  }
}

Remplacer example.com avec votre domaine. Les certificats SSL ont été fournis par Let's Encrypt certbot.

1
répondu mixel 2017-11-19 08:45:57

Comme je l'ai mentionné dans un question pertinente, j'ai trouvé 5 façons de générer des URLs sécurisées.

  1. configurer votre serveur web pour rediriger toutes les requêtes non sécurisées vers https. Exemple de configuration nginx:

    server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name example.com www.example.com;
        return 301 https://example.com$request_uri;
    }
    
  2. Définissez votre variable d'environnement APP_URL à l'aide de https:

    APP_URL=https://example.com
    
  3. utiliser helper secure_url () (Laravel5.6)--8-->

  4. ajouter la chaîne suivante à AppServiceProvider::initialisation (), méthode (pour la version 5.4+):

    \Illuminate\Support\Facades\URL::forceScheme('https');
    
  5. définir implicitement le schéma du groupe de routes (Laravel5.6):

    Route::group(['scheme' => 'https'], function () {
        // Route::get(...)->name(...);
    });
    

    à l'heure actuelle, cette méthode n'est pas documentée, mais elle fonctionne bien.

1
répondu Prisacari Dmitrii 2018-07-17 12:48:09

de référence Pour de futurs visiteurs:

la fonction secure_url ne gère pas correctement les paramètres GET. Ainsi, par exemple, si vous voulez convertir les url que l'utilisateur a visité dans une url sécurisée tout en conservant l'OBTENIR champs, vous devez utiliser ceci:

secure_url(Request::path()).'?'.http_build_query(Input::all());

en particulier, notez l'utilisation de path () plutôt que url () - si vous lui donnez une url complète, il ne remplace pas le http au début, ce qui le rend efectivement inutile.

0
répondu Benubird 2014-09-12 10:42:56

j'ai rencontré ce problème en essayant de générer une route comme forme d'action dans Blade en utilisant Laravel 5.4. Puis j'ai cliqué sur secure_url (), donc j'ai essayé

{{ secure_url(route('routename', $args)) }} 

cela renvoie toujours une URL non sécurisée. :-(

après avoir creusé le code et ajouté quelques journaux de débogage, j'ai finalement compris que secure_url ne change pas l'argument d'url entrante, si c'est déjà une URL absolue (y compris le schéma).

heureusement route a un drapeau absolu comme le troisième argument, et renvoie une URL relative si $absolute est passé comme false.

en supposant que /a / {id}/b est une route appelée "A. b

route('a.b', 1)        : will return http://[domain]/a/1/b 
route('a.b', 1, false) : will return /a/1/b

Joindre les deux je suis arrivé à :

{{ secure_url(route('routename', $args, false)) }}

Comme prévu, il a généré https://[domaine]/routeXXX

: -)

0
répondu 79man 2017-04-28 12:18:01

Placer dans vos filtres.le fichier php et partout seront forcés à https tout en conservant les paramètres D'URL:

//force ssl
App::before(function () {
if(!Request::secure() && App::environment() != 'local')
{
    $baseHost = Request::getHttpHost();
    $requestUri = Request::getRequestUri();
    $newLink = 'https://'.$baseHost.$requestUri;

    return Redirect::to($newLink);
}});
-2
répondu Anthony Farr 2016-11-09 19:33:56

pour générer une route sécurisée (https), utilisez l'option 'avant' filtre appelé 'auth'suivante:

Par exemple:

Route::get('your-route', ['before' => 'auth', 'uses' => YourController@yourAction']);

Maintenant, lorsque vous afficherez votre lien, il sera prepended avec 'https'

-5
répondu omar j 2015-05-15 09:41:02