2016-11-18 10 views
0

У меня есть несколько страниц в моем приложении laravel, которые мне нужно передать в Facebook.Обнаружение Facebook Crawler в промежуточном программном обеспечении

Вещь, когда я делюсь ею, Facebook получаю свойства og: изображение с страницы входа, поскольку оно перенаправляется моим промежуточным программным обеспечением.

Я увидел here, что я должен обнаружить Facebook User Agent и перенаправить на общедоступную страницу, которая должна иметь свойства openGraph для визуализации ссылки в Facebook.

Это единственный способ?

я в конечном итоге создание промежуточного слоя с переключателем внутри, чтобы управлять всей дифферент PUBLICS страницы у меня есть, это не так приятно ...

Есть idean, как я должен сделать это ???

+0

Зачем вам нужно обнаруживать сканер Facebook? – WizKid

+0

Вы пытаетесь открыть страницу, защищенную паролем? –

+0

Если вы хотите публиковать контент публично, то было бы лучше, если бы этот контент был общедоступным. Какая польза от этого, если я увижу одну из ваших общих ссылок в своей ленте новостей, только чтобы потом перенаправить на страницу входа на вашем конце? – CBroe

ответ

1

Я решил, что создание моего собственного Middleware: 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); 
    } 
} 

Затем я создал ресурсы/Views/государственный/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 }}"/> 

что публичная страница, которая просто есть информация, необходимая для публикации в Facebook.

Тогда в App \ Http \ Kernel.php добавить маршрут внутри $ middlewareGroups в 'Сети', прежде, чем Authenticate Middleware, так что переадресовать его на публичной странице:

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

Решение существует в StackOverflow , как прокомментировал, но ни один из них для Laravel 5.3!

Надеюсь, это поможет!