head 태그 순서와 SEO | canonical 위치·메타태그 배치 기준

head 태그 순서와 canonical·메타태그 배치 코드 예제

canonical 태그는 head 위쪽에 있어야 한다는 글을 여러 번 봤습니다. 어떤 글은 title 앞에 두면 안 된다고 하고, 어떤 글은 description보다 먼저 두는 것이 좋다고 했습니다. 처음에는 순서 자체가 랭킹에 영향을 주는 줄 알았습니다. 그래서 title, canonical, description의 위치를 바꿔보며 확인했습니다. 결론은 조금 달랐습니다. head 안에 정상적으로 들어가기만 하면 canonical의 정확한 순서가 직접적인 순위 요소처럼 … 더 읽기

검색 결과 페이지 SEO | 색인 여부와 title·H1·canonical 설정 기준

검색 결과에 따라 robots와 canonical을 설정하는 PHP 코드

게시판 검색 URL을 짧게 바꾸고 나니 새로운 고민이 생겼습니다. 예전에는 복잡한 쿼리스트링이라 검색엔진에 보여주고 싶지 않았지만, 이제는 사람이 공유해도 어색하지 않은 주소가 됐습니다. 주소가 깔끔해지면 질문이 바뀝니다. 이 검색 결과 페이지를 색인시켜도 될까, 아니면 전부 noindex로 막아야 할까. 처음에는 둘 중 하나를 고르는 문제라고 생각했습니다. 하지만 실제로는 검색 결과 페이지도 상태가 다릅니다. 결과가 충분히 있는 … 더 읽기

구글 검색 설명이 화면과 다를 때 | 목록 데이터로 메타 설명 만들기

게시판 목록 데이터로 메타 설명을 생성하는 PHP 코드

게시판 목록 페이지의 메타 설명을 자동 생성하도록 바꿨습니다. 최신 글 제목 몇 개를 모아 description에 넣으면 게시판마다 설명이 달라질 거라고 생각했습니다. 처음에는 잘 되는 것처럼 보였습니다. 그런데 나중에 구글 검색 결과를 확인해보니, 실제 화면에 보이지 않는 글 제목이 설명에 들어가 있었습니다. 사용자는 검색 결과 설명을 보고 들어왔는데, 화면에서는 그 글을 찾을 수 없는 상태였습니다. 이 … 더 읽기

스크랩·소스보기 버튼 정리 | 중복 URL과 불필요한 크롤링 줄이기

불필요한 게시판 링크 제거와 삭제 URL의 410 처리를 보여주는 코드

게시글 상세 페이지 하단에 스크랩, 소스보기, 인쇄, 신고 버튼이 붙어 있었습니다. 오래된 게시판 프로그램에서 기본으로 제공하던 기능들이라 별생각 없이 두고 있었습니다. 문제는 사용자는 거의 누르지 않는 버튼을 검색엔진은 성실하게 따라간다는 점이었습니다. 글 하나마다 여러 개의 부가 URL이 생겼고, 서치콘솔에는 실제 게시글보다 부가 기능 주소가 더 많이 잡히고 있었습니다. 이 글은 버튼 몇 개를 지운 이야기만은 … 더 읽기

게시판 메타 설명 자동 생성하기 | 최신 글 제목을 활용한 PHP 설정

최신 글 제목으로 게시판 메타 설명을 자동 생성하는 PHP 코드

게시판 목록 페이지의 메타 설명이 전부 똑같이 출력되고 있었습니다. 공지사항, 자유게시판, 자료실, 게임 게시판이 모두 같은 문장을 달고 있었고, 검색 결과에서도 차이가 거의 없어 보였습니다. 처음에는 목록 페이지라서 어쩔 수 없다고 생각했습니다. 게시글 상세처럼 본문이 있는 것도 아니고, 게시판마다 따로 설명을 써둔 것도 아니었기 때문입니다. 하지만 그냥 두면 사이트 전체에 중복 메타 설명이 계속 쌓이는 … 더 읽기

테이블명만 남은 URL 정리하기 | DB 조회로 진짜 주소 찾기

DB 조회로 불완전한 URL을 복원하는 PHP 301 리다이렉트 코드

게시글 하나가 여러 주소로 열리고 있었습니다. 표준 주소도 있었고, 예전 쿼리스트링 주소도 있었습니다. 그런데 가장 이상했던 것은 사이트 아이디도 없고 게시판 번호도 빠진 주소였습니다. 이 주소만 보면 어느 사이트의 어느 게시판 글인지 알 수 없습니다. 그런데도 글은 정상으로 열렸습니다. 처음에는 “열리니까 괜찮은 것 아닌가”라고 생각했지만, 검색엔진 입장에서는 같은 글이 정체불명의 URL로 하나 더 생긴 상태였습니다. … 더 읽기

아이콘 이미지 대신 문자 기호 쓰기 | 요청 수와 레이아웃 잡기

장식용 화살표 이미지를 문자 기호와 CSS로 대체한 코드

서브메뉴 앞에 작은 화살표 아이콘 이미지가 있었습니다. 용량은 1KB도 되지 않는 GIF 파일이었고, 화면에서도 아주 작은 장식 요소였습니다. 처음에는 굳이 손댈 필요가 없다고 생각했습니다. 그런데 접근성 정리를 하다가 이 이미지가 페이지마다 반복 출력되는 것을 봤습니다. 메뉴가 12개면 같은 아이콘 요청도 12번 가까이 등장했고, 이미지가 늦게 로드될 때 메뉴 줄이 미세하게 움직이는 것도 보였습니다. 이 글은 … 더 읽기

검색 폼 URL을 짧게 바꾸는 방법 | JS 가로채기와 서버 301 처리

검색 폼 URL을 짧게 바꾸는 JavaScript와 서버 301 처리 코드

게시판 검색 폼을 바꾸고 싶었지만 폼을 만드는 코드는 쉽게 손댈 수 없었습니다. 오래된 게시판 엔진 안쪽에서 hidden 값과 검색어 이름을 만들고 있었고, 입력 이름 하나만 바꿔도 검색 로직이나 페이지네이션이 같이 깨질 수 있는 구조였습니다. 그렇다고 기존 검색 URL을 그대로 두기에는 너무 길고 복잡했습니다. 목표는 아래처럼 바꾸는 것이었습니다. 이 글은 자바스크립트로 폼을 가로채는 방법만 설명하는 글이 … 더 읽기

없는 페이지를 메인으로 보내면 안 되는 이유 | 404·410·301 선택 기준

없는 페이지·삭제된 페이지·이전된 주소를 404·410·301로 처리하는 PHP 코드

존재하지 않는 게시판 번호로 접근하면 보기 싫은 에러 화면이 떴습니다. 사용자에게 흉한 화면을 보여주기 싫어서 처음에는 없는 주소를 전부 사이트 메인으로 301 리다이렉트했습니다. 화면만 보면 깔끔해진 것처럼 보였습니다. 하지만 몇 주 뒤 서치콘솔에서 소프트 404 경고가 쌓이기 시작했습니다. 없는 페이지를 메인으로 보내는 처리가 검색엔진에게는 잘못된 신호가 되고 있었습니다. 이 글은 404, 410, 301의 사전적 의미를 … 더 읽기

짧은 URL로 바꾸자 CSS가 깨진 이유 | 상대경로와 base 태그 해결

짧은 URL에서만 base 태그를 출력하는 PHP 코드

/page.php?id=site&menu=1250 주소를 /site/1250처럼 짧은 URL로 바꿨습니다. 리라이트 규칙은 정상으로 보였고, HTML도 잘 출력됐습니다. 그런데 화면을 열자마자 CSS가 전부 빠진 것처럼 깨졌습니다. 처음에는 .htaccess 규칙을 잘못 쓴 줄 알았습니다. 하지만 네트워크 탭을 보니 원인은 리라이트가 아니라 상대경로였습니다. 브라우저가 CSS, 이미지, 자바스크립트 파일을 엉뚱한 위치에서 찾고 있었습니다. 이 글은 base 태그 사용법만 설명하는 글이 아닙니다. 쿼리스트링 URL을 … 더 읽기