2017-08-12 4 views
0

Je me demandais comment créer des URL dans Laravel, sans n'importe quel préfixe.Laravel 5.4 wildcard de route

Par exemple:

Comment transformer l'URL suivante:

http://www.example.com/posts/some-post 

A cette URL:

http://www.example.com/some-post 

Je sais que cela peut se faire comme:

Route::any('/{slug}', function($slug) { 
    $page = App\Models\Page::firstByAttributes(['slug' => $slug]); 
    if($page) { 
     return Redirect::action('[email protected]', array($page)); 
    } 
})->where('slug', '.*'); 

Mais pour le code ci-dessus, je dois maintenir tous les limaces uniques pour chaque URL.

Tout autre moyen de le faire correctement?

Merci.

+0

Que diriez-vous 'Route :: get ('{limaces}', 'PagesController @ find');'? Pouvez-vous montrer toutes vos routes? – devk

+0

Faut-il le faire dans Laravel, pourquoi pas avec les redirections Apache/nginx? –

+0

@devk J'ai déjà posté le même code. Le problème est que je dois enregistrer pour chaque contrôleur de slug et d'appel. –

Répondre

0

La redirection que vous décrivez peut être facilement effectuée avec une règle de réécriture Apache, avant que vous n'appeliez la couche d'application, ce qui devrait être beaucoup plus efficace. Par exemple, en supposant Apache est configuré pour permettre réoriente de .htaccess, ce qui suit devrait être suffisant:

RewriteEngine On 
RewriteRule ^posts/(.*) /$1 [R=301, L] 

Le R=301 indique la redirection doit se produire avec un code de réponse 301 http, ce qui permettra de préserver votre rang de page, etc.

1

Si vous voulez faire avec Laravel:

Routes

Route::get('posts/{slug}', function($slug) { 
    // Does a 302 redirect, and the route below will handle it 
    return redirect($slug); 
}); 
Route::get('{slug}', '[email protected]'); 

Contrôleur

public function find($slug) { 
    $page = App\Models\Page::where('slug', $slug); 
    // ... your code 
    // ... 
    // return view('something', ['page' => $page]); 
} 
+0

Ceci est très similaire à ma solution publiée en question. En fait, je voulais appeler le contrôleur basé sur url limace. c'est-à-dire http://www.example.com/{slug}. En ce moment j'utilise du code posté dans ma question et ça fonctionne bien. Merci. –