2017-08-12 330 views
0

我想知道如何在Laravel中創建URL,沒有任何前綴。Laravel 5.4路由通配符

例如:

如何變換以下網址:

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

此URL:

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

我知道這是可以做到:

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

但是對於上面的代碼我必須爲每個網址保留所有獨特的slu slu。

任何其他方式來做到這一點的權利?

謝謝。

+0

怎麼樣'路線::獲得( '{}塞', 'pagesController @找到');'?你能顯示你所有的路線嗎? – devk

+0

您是否必須在Laravel中執行此操作,爲什麼不使用Apache/nginx重定向? –

+0

@devk我已經發布了相同的代碼。問題是我必須記錄每個slu&和呼叫控制器。 –

回答

0

您在訪問應用程序層之前,可以使用Apache重寫規則輕鬆完成您描述的重定向,這應該更加高效。例如,假設Apache是​​設置爲允許的.htaccess重定向,下面應該是足夠了:

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

R=301表示重定向應該用301 HTTP響應代碼,這將保護您的網頁排名等

發生
1

如果你想與Laravel做到這一點:

路線

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]'); 

控制器

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

這與我發佈的解決方案非常相似。其實我想調用基於url slug的控制器。即http://www.example.com/{slug}。現在我正在使用我的問題及其工作正常發佈的代碼。謝謝。 –