2016-11-18 3 views
0

Ich habe mehrere Seiten in meiner Laravel App, die ich Link in Facebook teilen muss.Detect Facebook Crawler in Middleware

Die Sache ist, wenn ich es teile, Facebook bekommen die Eigenschaften og: Bild von Login-Seite, wie es von meiner Middleware Redirect ist.

Ich sah here, dass ich Facebook User Agent erkennen und auf eine öffentliche Seite umleiten sollte, die nur die OpenGraph-Eigenschaften haben sollte, um den Link in Facebook zu rendern.

Ist es der einzige Weg?

Ich werde eine Middleware zu schaffen, mit einem Schalter im Inneren am Ende, die Öffentlichkeiten alle differents Seiten verwalten Ich habe es nicht so schön ist ...

Irgendwelche Idean wie soll ich das tun ???

+0

Warum müssen Sie den Facebook Crawler erkennen? – WizKid

+0

Versuchen Sie die login-geschützte Seite zu teilen? –

+0

Wenn Sie Inhalte öffentlich teilen möchten, wäre es am besten, wenn dieser Inhalt auch öffentlich verfügbar wäre. Was nützt es, wenn ich einen Ihrer freigegebenen Links in meinem Newsfeed sehe, um dann auf die Anmeldeseite weitergeleitet zu werden? – CBroe

Antwort

1

Ich löste es meine eigene Middleware zu schaffen: RedirectCrawlers

<?php 

namespace App\Http\Middleware; 

use App\Tournament; 
use Closure; 
use Illuminate\Support\Facades\Route; 

class RedirectCrawlers 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     $crawlers = [ 
      'facebookexternalhit/1.1', 
      'facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)', 
      'Facebot', 
      'Twitterbot', 
     ]; 

     $userAgent = $request->header('User-Agent'); 

     if (str_contains($userAgent, $crawlers)) { 
      switch (Route::getCurrentRoute()->getPath()) { 
       case "tournaments/{tournament}/register": 
        $tournament = Tournament::where('slug', $request->tournament)->first(); 
        return view('public/register', compact('tournament')); 
      } 
     } 
     return $next($request); 
    } 
} 

Dann habe ich eine resources/Ansichten/public/register.blade.php

<meta property="og:title" content="{{trans('core.competitors_register') }}"/> 


<meta name="description" content="Registrate en el torneo {{ $tournament->name }}"/> 
<meta property="og:description" content="Registrate en el torneo {{ $tournament->name }}"/> 
<meta property="og:type" content="website"/> 
<meta property="og:image" content="https://kendozone.com/wp-content/uploads/2016/04/home.jpg"/> 
<meta property="og:image:secure_url" content="https://kendozone.com/wp-content/uploads/2016/04/home.jpg"/> 
<meta property="og:url" content="{{$request->url()}}"/> 
<meta property="fb:app_id" content="780774498699579"/> 

<meta name=" twitter:title" content="{{trans('core.competitors_register')}}"/> 
<meta name="twitter:image" content="https://kendozone.com/wp-content/uploads/2016/04/home.jpg"/> 
<meta name="twitter:card" content="summary"/> 
<meta name="twitter:description" content="Registrate en el torneo {{ $tournament->name }}"/> 

, die eine öffentliche Seite ist, dass nur haben Informationen benötigt, um Facebook zu teilen.

dann in App \ Http \ Kernel.php füge ich die Strecke in $ middlewareGroups in 'Web', bevor Authentifizieren Middleware, so dass sie es der Öffentlichkeit Seite umleiten:

 \App\Http\Middleware\RedirectCrawlers::class, 

Lösung besteht in Stackoverflow , wie kommentiert, aber keine von ihnen für Laravel 5.3!

Hoffe es hilft!