webentwicklung-frage-antwort-db.com.de

Laravel generiert sichere https-URL aus der Route

Ich kann nicht wirklich einen Weg finden, um eine sichere URL aus dem Routennamen zu generieren.

Um eine vollständige URL zu erhalten, verwende ich 

echo route('my_route_name');

Aber was tun, wenn ich eine URL mit https haben möchte?

28

Tatsächlich stellt sich heraus, dass es für laravel egal ist, ob die URL sicher ist oder nicht, da sie basierend auf der aktuellen URL generiert wird. Wenn Sie sich auf der https-Seite befinden, gibt route() eine sichere URL zurück. Wenn auf http, dann http:// url

Das Problem war, dass Laravel die Aktivierung von https nicht erkannt hat, was auf eine fehlerhafte Serverkonfiguration zurückzuführen war.

Sie können überprüfen, ob Laravel die aktuelle Verbindung als https sieht, indem Sie Request::isSecure(); aufrufen.

7

UPDATE: Wie in den Kommentaren erwähnt, können Sie URL::forceSchema('https'); für Laravel zwischen 4.2-5.3 oder URL::forceScheme('https'); für Version 5.4+ in der boot-Methode Ihrer AppServiceProvider-Datei hinzufügen.

Alte Antwort:

Es ist eigentlich völlig möglich und es wird nur eine Codezeile benötigt, um dies zu erreichen. 

Laravel prüft das Vorhandensein von SSL nicht selbst, es hängt von Symfony ab. Und es ist unser Schlüssel, damit wir glauben, dass die aktuelle Anfrage sicher ist. 

Die Sache ist, wir müssen HTTPSserver param auf true setzen und die einfachste Methode ist, den folgenden Code in die boot-Methode Ihrer AppServiceProvider einzufügen:

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

In meinem Fall brauche ich SSL nur in der Produktion zu erzwingen, die lokale Umgebung sollte weiterhin mit http arbeiten. So erzwinge ich SSL nur in der Produktion: 

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

Übrigens, beachten Sie diese Begriffe, Sie könnten sie in der Zukunft brauchen.

53
Ionut Bajescu

Ich denke, dass es nur einen Weg gibt, dies zu tun.

Um die sichere URL für Ihre benannten Routen zu generieren, können Sie Ihre Route in die secure_url-Hilfsfunktion eingeben.

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

Sie können die route-Hilfsfunktion nicht wirklich verwenden, da sie standardmäßig eine absolute URL (mit http://) generiert und http nicht die gewünschte https-Version ist

6
Oni

Laravel 5.x generiert über route () eine sichere URL, wenn die eingehende Verbindung als sicher erkannt wird. Das Problem tritt normalerweise auf, wenn die App hinter Load Balancer oder Proxy (z. B. Cloudflare) versteckt ist, da die Verbindung zwischen App-Server und Load Balancer/Proxy möglicherweise nicht sicher ist.

Ich verwende jetzt Laravel Forge + Cloudflare. Dies ist der einfachste Weg, die App für eingehende Verbindungen als sicher zu erachten (nicht sicher, was andere Proxy angeht).

  1. Erstellen Sie ein selbstsigniertes Zertifikat (siehe https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs oder http: // www.selfsignedcertificate.com/ )

  2. Geben Sie im Forge-Fenster Ihren privaten Schlüssel und das Zertifikat über Sites > your-site > SSL Certificates > Install Existing Certificate ein. 

  3. Aktivieren Sie

  4. Wählen Sie im CloudFlare-Bedienfeld Crypto > SSL "Full" (nicht streng) aus.

  5. Fertig (es dauert einige Minuten, bis die Änderung propagiert wird)

Kurz gesagt, die Verbindung zwischen Client und Cloudflare wird durch Cloudflares eigenes SSL gesichert. Die Verbindung zwischen dem App-Server und Cloudflare wird über Ihr generiertes Zertifikat geschützt (die App betrachtet die Verbindung als sicher.).

Sie können das gleiche Prinzip auch für andere Stapel anwenden. 

5
Aditya

Wie ich in einer relevanten Frage erwähnte, habe ich 5 Wege gefunden, sichere URLs zu generieren.

  1. Konfigurieren Sie Ihren Webserver so, dass alle nicht sicheren Anforderungen an https umgeleitet werden. Beispiel für eine Nginx-Konfiguration:

    server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name example.com www.example.com;
        return 301 https://example.com$request_uri;
    }
    
  2. Legen Sie Ihre Umgebungsvariable APP_URL mit https fest:

    APP_URL=https://example.com
    
  3. Verwenden Sie helper secure_url () (Laravel5.6)

  4. Fügen Sie der AppServiceProvider :: boot () -Methode (für Version 5.4 und höher) die folgende Zeichenfolge hinzu:

    \Illuminate\Support\Facades\URL::forceScheme('https');
    
  5. Implizit festgelegtes Schema für die Routengruppe (Laravel5.6):

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

    Im Moment ist dieser Weg nicht dokumentiert, aber er funktioniert gut.

2

Verwenden Sie secure_url:

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

Sie müssen URL :: route auf false setzen, um keine vollständige URL zurückzugeben. Dann generiert die Funktion secure_url eine vollständig qualifizierte HTTPS-URL für den angegebenen Pfad.

Über die UrlGenerator-Benutzeroberfläche können Sie URL :: route verwenden

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
PHPGrandMaster

In den meisten Fällen sollten Routen mit demselben Schema erstellt werden, mit dem Ihre Site geladen wurde. Laravel erkennt automatisch, ob die Anfrage den Header X-Forwarded-Proto hat, und verwendet diesen, um zu entscheiden, welches Schema in generierten Routen-URLs verwendet werden soll. Wenn sich Ihre Site hinter dem Reverse-Proxy befindet, sollten Sie der Liste der vertrauenswürdigen Proxys die Reverse-Proxy-IP-Adresse hinzufügen. https://github.com/fideloper/TrustedProxy package hilft dabei. Es ist inklusive in Laravel 5.5. Zum Beispiel sieht mein config/trustedproxy.php so aus:

<?php

return [
    'proxies' => '*',

    'headers' => [
    ]
];

Ich verwende es mit Nginx Reverse Proxy, der die folgende Konfiguration hat:

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

Ersetzen Sie example.com durch Ihre Domain. SSL-Zertifikate wurden von Let's Encrypt mit certbot bereitgestellt.

2
mixel

Auf laravel 5.5. * Sie müssen lediglich https zu Ihrer .env-Datei hinzufügen AppServiceProvider hatte bereits eine Funktion, die prüft, ob Ihre APP_URL oder app.url in Ihrer Konfiguration über https verfügt.

class AppServiceProvider extends ServiceProvider
{
 public function boot()
 {

    \URL::forceRootUrl(\Config::get('app.url'));    
    if (str_contains(\Config::get('app.url'), 'https://')) {
        \URL::forceScheme('https');
    }
 }
1
Joesel T Duazo

Laut der Laravel-Dokumentation zur url () helper-Methode.

Wenn kein Pfad angegeben wird, lautet die Instanz Illuminate\Routing\UrlGenerator ist zurückgekommen

So können Sie die secure -Methode der UrlGenerator -Klasse folgendermaßen verwenden:

echo url()->secure('my_route_name');
0
Engell Mejía

Ich bin auf dieses Problem gestoßen, als ich versuchte, eine Route als Formularaktion in Blade mit Laravel 5.4 .. zu generieren. Dann traf ich auf secure_url (), also versuchte ich es 

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

Dies gab immer noch eine nicht sichere URL zurück. :-(

Nachdem ich den Code durchgearbeitet und einige Debug-Protokolle hinzugefügt hatte, stellte ich schließlich fest, dass secure_url das eingehende URL-Argument nicht ändert, sofern es sich bereits um eine absolute URL (einschließlich des Schemas) handelt.

Glücklicherweise hat route als drittes Argument ein absolutes Flag und gibt eine relative URL zurück, wenn $ absolute als false übergeben wird.

Angenommen, a/{id}/b ist eine benannte Route "a.b"

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

Zusammen mit den beiden kam ich an:

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

Wie erwartet erzeugte es https: // [domain]/routeXXX

:-)

0
79man

Zur Referenz zukünftiger Besucher:

Die Funktion secure_url verarbeitet GET-Parameter nicht korrekt. Wenn Sie beispielsweise die vom Benutzer besuchte URL in eine sichere URL umwandeln möchten, während Sie die GET-Felder beibehalten, müssen Sie Folgendes verwenden:

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

Beachten Sie insbesondere die Verwendung von path () anstelle von url (). Wenn Sie eine vollständige URL angeben, wird der http am Anfang nicht ersetzt, wodurch er effektiv nutzlos wird.

0
Benubird