PHP Laravel 에서 사이트맵을 생성하는 간단한 방법
저와 같이 라라벨로 웹사이트를 만드신 분들
반갑습니다
구글이나 빙 등, 검색 포털 사이트에 나의 웹사이트를 공개하려면
사이트맵을 반쯤 필수적으로 등록해야합니다
글을 등록할 때마다 직접 색인을 해주는 방법도 있지만
글 작성이 빈번하게 일어나는 경우에는 너무 번거롭겠죠?
뭐 직접 프로젝트를 성공적으로 완성하신 분들이라면 당연히 아시겠지만...
사이트맵을 만들어주는 생성 사이트도 여럿 있지만
또 서버의 프로젝트 폴더로 옮겨줘야하니
매우 귀찮은 작업을
그나마 쉽게할 수 있는 방법을 공유합니다.
1. spatie의 sitemap generator 패키지를 설치
composer require spatie/laravel-sitemap
그리도 동시에 config도 생성 해줍니다
php artisan vendor:publish --provider="Spatie\Sitemap\SitemapServiceProvider" --tag=sitemap-config
config에서 사실 특별히 수정할 내용을 없으실 겁니다
2. 라라벨 Command 생성
php artisan make:command GenerateSitemap
커맨드 생성 후 아래와 같이 작성 해주세요
<?php
namespace App\Console\Commands;
use Spatie\Sitemap\Sitemap;
class GenerateSitemap extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'generate:sitemap';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
$sitemap = Sitemap::create();
$sitemap->writeToFile(public_path('sitemap.xml'));
return Command::SUCCESS;
}
}
해당 코드에서 signature 부분은 php artisan 명령어를 실행할 커맨드를 지정해줍니다
예를 들어서 이제 터미널에
php artisna generate:sitemap 이라고 작성하면
해당 코드가 실행이 되게 됩니다
3. .env 파일에서 APP_URL 수정
자신의 도메인을 작성하거나 로컬에서 테스트하신다면 localhost:포트 를 작성해주시면 됩니다
sitemap을 create할 시 .env의 APP_URL을 기준으로 URL이 작성되기 떄문이에요
4. handle 작성
먼저 model 객체를 use로 가져옵니다
use App\Models\board;
예시로 board라는 이름의 게시글을 저장하는 모델을 가져왔습니다
그리고 handel 코드를 아래와 같이 작성 해봅니다
public function handle()
{
$sitemap = Sitemap::create();
#root 페이지
$sitemap->add('/');
#모든 게시글 가져오기
$boards = board::all();
#자신이 설정한 URL 구성대로 값들을 넣어줍니다
foreach ($boards as $board) {
$sitemap->add("/read/{$board->board_category}/{$board->board_id}");
}
#사이트맵 파일 생성
$sitemap->writeToFile(public_path('sitemap.xml'));
return Command::SUCCESS;
}
이렇게 하지 않고도 localhost에서 자동으로 모든 URL을 스캔해주는 경우도 있지만
SSL을 적용하거나 실제 서버 환경에 따라서 생성이 정상적으로 되지 않는 경우가 발생할 수 있습니다
그리고 생성해주는 사이트를 이용해서 생성하게되면
원하지 않는 페이지들이나 redirect가 포함된 페이지들도 포함되기에
원하는 페이지들에 대해서만 사이트맵을 작성할 수 있는 이 방법이
제 생각에는 가장 좋은 것 같습니다