제목이 변경돼도 이전 링크로 블로그 글 찾아갈 수 있도록 URL slug 만들기

Submitted by river - 등록 5 years ago - 수정 5 years ago

Laravel로 블로그 시스템을 만들었다고 하자. 보통 블로그 글 URL은 Str::slug 메서드를 사용해서 만들게 된다.

$url = Str::slug('My First Blog Post!');
// my-first-blog-post

슬러그(Slug)는 핵심 키워드 만을 조합하여 신문, 잡지 등의 긴 제목을 간단하게 만드는 것을 말하고, 검색에 용이한 URL을 만들기 위해서 많이 사용된다.

다음의 시나리오를 생각해보자.

  1. My Frist Blog Post! 제목으로 글을 작성했다.
  2. 작성한 글의 URL은 http://example.com/posts/my-frist-blog-post가 된다.
  3. 누군가가 이 글을 보고 공유를 했다.
  4. 제목에 오타가 있는 걸 발견했다. 제목을 수정했다.
  5. 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'));
}

comments powered by Disqus