제목이 변경돼도 이전 링크로 블로그 글 찾아갈 수 있도록 URL slug 만들기
Submitted by river -
등록 10 years ago - 수정 10 years ago
Laravel
로 블로그 시스템을 만들었다고 하자. 보통 블로그 글 URL은 Str::slug
메서드를 사용해서 만들게 된다.
$url = Str::slug('My First Blog Post!');
// my-first-blog-post
슬러그(Slug)
는 핵심 키워드 만을 조합하여 신문, 잡지 등의 긴 제목을 간단하게 만드는 것을 말하고, 검색에 용이한 URL을 만들기 위해서 많이 사용된다.
다음의 시나리오를 생각해보자.
- My Frist Blog Post! 제목으로 글을 작성했다.
- 작성한 글의 URL은
http://example.com/posts/my-frist-blog-post
가 된다. - 누군가가 이 글을 보고 공유를 했다.
- 제목에 오타가 있는 걸 발견했다. 제목을 수정했다.
- URL이
http://example.com/posts/my-first-blog-post
로 변경이 되고, 이전 링크는 동작을 하지 않는다.
이런 상황이 발생되는 이유는 글 제목만으로 URL을 정했기 때문이다. 글 제목이 변경되어 URL이 변경되도 과거 링크가 동작하기 위해서는 글의 id
를 함께 URL로 사용하면 된다.
routes.php
# Route patterns
Route::pattern('id', '[0-9]+');
Route::pattern('slug', '[^/]+');
Route::get('posts/{id}-{slug}', ['as' => 'posts.show', 'uses' => 'PostsController@getShow' ]);
PostsController.php
public function getShow($id, $slug)
{
$post = $this->posts->find($id);
if (is_null($post)) {
return Redirect::route('home');
}
// url에서 추출한 slug와 현재 글의 slug가 다르면
// 현재 올바른 URL로 리다이렉트한다.
if ($post->slug !== $slug) {
return Redirect::route('post.show', [$post->id, $post->slug], 301);
}
return View::make('posts.show', compact('post'));
}
Stats
-
0 likes
- 2925 views