검색 결과에 JSON 코드가 뜨는 이유 | PHP 메타 설명 정제 순서

JSON과 스크립트를 제거하는 PHP 메타 설명 정제 코드

게시글 상세 페이지의 메타 설명을 본문에서 자동으로 만들도록 바꿨습니다. 처음에는 잘 되는 것처럼 보였습니다. 그런데 어느 날 검색 결과 요약문에 사람이 읽을 문장이 아니라 JSON 코드가 그대로 들어간 것을 발견했습니다. 문제는 본문 정제 함수였습니다. 태그를 지우고 길이를 자른 뒤에 구조화 데이터를 제거하려고 했는데, 이미 JSON이 중간에서 잘린 상태라 제거 패턴이 맞지 않았습니다. 이 글은 메타 … 더 읽기

같은 게시판이 두 주소로 열렸던 이유 | 메뉴 타입 조회와 301 리다이렉트

DB의 menu_type을 확인한 뒤 게시판이면 표준 경로로 301 리다이렉트하는 PHP 코드

게시판 주소를 /mysite/board/856으로 통일하는 작업을 끝냈다고 생각했습니다. 새 주소로 접속하면 게시판도 잘 열렸고, 목록과 글 상세도 문제없이 보였습니다. 그런데 서치콘솔에서 이상한 주소가 보였습니다. 같은 게시판이 /mysite/board/856뿐 아니라 /mysite/856으로도 잡히고 있었습니다. 두 주소 모두 정상 페이지처럼 열렸고, 응답 코드도 200 OK였습니다. 이 글은 짧은 URL을 만드는 방법만 설명하는 글이 아닙니다. 새 게시판 경로를 만들고도 옛 경로를 … 더 읽기

HTML 4.01에서 HTML5로 전환 | DOCTYPE 변경 후 접근성 점검

HTML5 DOCTYPE, lang, landmark, label을 적용한 코드 예시

15년 넘게 운영하던 HTML 4.01 기반 사이트를 HTML5 구조로 바꿨습니다. 처음에는 문서 맨 위의 DOCTYPE만 바꾸면 되는 작업이라고 생각했습니다. 하지만 실제로 적용해보니 레이아웃, 이미지 여백, 폼 라벨, 헤딩 구조, 테이블 마크업까지 같이 보게 됐습니다. 특히 오래된 사이트는 화면은 잘 보여도 접근성 기준으로 보면 빠진 부분이 많았습니다. lang 속성이 없고, 검색창에는 label이 없고, 로고와 제목 구조도 … 더 읽기

검색 URL을 짧게 바꾸는 방법 | PHP 파라미터와 301 처리

q 파라미터 변환 및 검색 URL 301 리다이렉트 PHP 코드

검색 결과 페이지 주소가 너무 길었습니다. 검색어 하나를 넣었을 뿐인데 URL에는 id, type, site_search_word, x, y 같은 값이 줄줄이 붙었습니다. 처음에는 보기 싫은 주소를 짧게 바꾸는 작업이라고 생각했습니다. 하지만 실제로 해보니 단순한 URL 미화 작업이 아니었습니다. 검색어를 잃지 않아야 하고, 기존 긴 URL도 살려야 하며, 내부 검색 로직은 최대한 건드리지 않아야 했습니다. 이 글은 검색 … 더 읽기

쿼리스트링 URL을 짧게 바꾸는 방법 | 301 리다이렉트 5가지 원칙

쿼리스트링 URL을 정규 URL로 이동하는 PHP 301 리다이렉트 코드

오래된 PHP 사이트의 쿼리스트링 URL을 짧은 URL 구조로 바꿨습니다. 주소를 바꾸는 것 자체는 .htaccess와 PHP 코드 몇 줄이면 가능했습니다. 하지만 실제로 어려웠던 부분은 새 주소를 만드는 일이 아니라, 기존 주소를 안전하게 새 주소로 보내는 일이었습니다. 처음에는 “주소만 예쁘게 바꾸면 되겠지”라고 생각했습니다. 그런데 막상 작업해보니 리다이렉트 체인, 302 처리, 검색 파라미터 누락, 내부 링크 방치 같은 … 더 읽기

H1 태그가 3개인 페이지 수정 | 목록·상세·검색 결과 조건부 출력

목록과 상세 페이지의 H1을 구분해 출력하는 PHP 코드

온페이지 점검 도구를 돌렸더니 H1 태그가 3개입니다라는 경고가 떴습니다. 처음에는 큰 문제라고 생각하지 않았습니다. 로고도 중요하고, 게시판 이름도 중요하고, 글 제목도 중요하다고 봤기 때문입니다. 하지만 실제 페이지 구조를 다시 보니 H1이 너무 많이 쓰이고 있었습니다. 사이트 로고, 게시판 이름, 글 제목이 모두 H1으로 출력되고 있었고, 검색엔진과 스크린 리더 입장에서는 이 페이지의 주제가 무엇인지 흐려질 수 … 더 읽기

중복 URL이 생기는 이유 | canonical과 301 리다이렉트 차이

DB 소속 정보를 확인해 정규 URL로 301 리다이렉트하는 PHP 코드

처음에는 canonical 태그만 넣으면 될 줄 알았습니다. 같은 게시글이 여러 주소로 열려도 <link rel=”canonical”>이 정답 주소를 가리키고 있으면 검색엔진이 알아서 정리해줄 거라고 생각했습니다. 그런데 서치콘솔을 보니 중복 URL 보고가 계속 남아 있었습니다. 더 확인해보니 문제는 canonical 태그 자체가 아니었습니다. 잘못된 URL도 여전히 200 OK로 정상 출력되고 있었습니다. 이 글은 canonical 태그만 넣는 방법을 설명하는 글이 … 더 읽기

사이트 전역의 target=_blank 제거 | 모바일 새 창 링크 UX 개선

새 창 링크를 예외로 처리하고 보안 속성을 추가하는 PHP 링크 생성 함수 코드

기존 사이트를 정리하다가 링크 대부분에 target=”_blank”가 붙어 있는 것을 발견했습니다. 외부 링크만 그런 것이 아니라 메뉴, 게시글 제목, 페이지네이션, 자료 링크까지 새 창으로 열리고 있었습니다. 처음에는 큰 문제가 아니라고 생각했습니다. 새 창으로 열리면 기존 페이지가 남으니 사용자를 배려하는 방식처럼 보였기 때문입니다. 하지만 모바일에서 직접 눌러보니 전혀 달랐습니다. 뒤로 가기가 끊기고, 탭이 쌓이고, 사용자가 원래 보던 … 더 읽기

쓰레기 쿼리 파라미터 제거 방법 | 중복 URL 색인과 301 리다이렉트 정리

불필요한 쿼리 파라미터를 제거하고 정규 URL로 301 이동하는 PHP 코드

서치콘솔의 페이지 리포트를 보다가 제가 만든 적 없는 주소들이 계속 잡히는 것을 봤습니다. 게시글은 하나인데 주소 뒤에 이상한 파라미터가 붙은 URL이 여러 개 생겨 있었습니다. 처음에는 검색엔진이 알아서 정리할 거라고 생각했습니다. 하지만 시간이 지나도 줄지 않았고, 오히려 비슷한 주소가 더 쌓였습니다. 결국 문제는 외부에서 붙은 파라미터만이 아니라, 오래된 사이트 구조와 버튼 방식이 중복 URL을 계속 … 더 읽기

카카오톡 공유 썸네일 오류 | og:image 확인

카카오톡 공유 썸네일 오류

게시글을 카카오톡에 공유했는데 글마다 다른 썸네일이 나오지 않고 계속 사이트 로고만 표시됐습니다. 처음에는 카카오톡 캐시 문제라고 생각했습니다. 하지만 여러 글을 테스트해도 결과는 같았습니다. 원인은 캐시만이 아니었습니다. 게시글마다 달라져야 할 og:image가 제대로 출력되지 않았고, 일부 페이지에서는 상대경로 이미지가 그대로 들어가 있었습니다. 결국 카카오톡은 본문 이미지 대신 공통 로고를 가져가고 있었습니다. 이 글은 오픈그래프 태그를 단순히 넣는 … 더 읽기