증상: 지운 글 번호에 410을 걸었는데 일부 주소가 410이 아니라 301로 나옵니다.
원인: 지운 글의 번호를 나중에 올린 첨부 이미지가 차지해서, 그 주소가 404가 아니라 첨부 페이지로 301됩니다.
해결: 410을 걸기 전에 번호마다 post_type 을 확인하고, attachment 가 쓰는 번호는 목록에서 뺍니다.
오래된 글을 정리하면서 지운 글 주소가 검색엔진에 "영구히 사라졌다"고 알리도록 410 응답을 걸었습니다. 그런데 전수로 확인하니 일부 주소는 410이 아니라 301이었습니다. 원인은 플러그인이 아니라 글 번호에 있었습니다.
26개 중 7개가 410이 아니라 301이었다
지운 글 번호 목록을 받아, 그 번호로 들어오는 요청에 410을 내는 작은 플러그인을 넣었습니다. 설치한 뒤 번호마다 ?p=번호 주소를 요청해 상태 코드를 셌습니다.
26개 중 19개는 410이었고, 7개는 301이었습니다. 301은 사이트 안의 다른 주소로 넘어가고 있었습니다. 같은 플러그인, 같은 목록인데 일부만 다르게 나온 것입니다.
그 번호를 첨부 이미지가 쓰고 있었다
워드프레스는 글, 페이지, 첨부 이미지를 모두 같은 표(wp_posts)에 넣고 같은 번호 순서를 씁니다. 첨부 이미지는 post_type=attachment 로 구분됩니다.
문제의 7개 번호는 글이 지워진 뒤 새로 올린 이미지가 받아 쓰고 있었습니다. 그래서 ?p=번호 로 들어오면 워드프레스가 그 이미지의 첨부 페이지로 301을 보냅니다.
이 7개는 한곳에 몰려 있지 않고 목록 여기저기에 1개에서 3개씩 섞여 있었습니다. 앞쪽 몇 개만 보고 넘어갔다면 놓쳤을 숫자입니다. 그 번호가 어떤 경로로 첨부 이미지에 다시 매겨졌는지까지는 확인하지 못했습니다. 확인한 것은 지금 그 번호의 주인이 첨부 이미지라는 사실입니다.
410 플러그인은 template_redirect 훅에서 is_404() 가 참일 때만 동작하게 만들어 두었습니다. 그 번호는 404가 아니라 301이므로 is_404() 가 거짓이 되고, 플러그인은 아예 실행되지 않았습니다.
| 번호를 쓰는 것 | ?p=번호 요청 결과 | 410 플러그인 |
|---|---|---|
| 아무것도 없음 | 404 상황 | 실행되어 410 응답 |
| 첨부 이미지(attachment) | 첨부 페이지로 301 | 실행되지 않음 |
번호마다 누가 쓰는지 먼저 본다
410을 걸기 전에 목록의 번호마다 다음 명령으로 현재 주인을 확인합니다.
wp post get <ID> --fields=post_type,post_status
결과가 오류(해당 번호 없음)면 410 목록에 그대로 둡니다. attachment 가 나오면 그 번호는 목록에서 뺍니다. 억지로 410을 걸면 살아 있는 이미지의 첨부 페이지를 죽이게 됩니다.
번호가 많으면 반복문으로 한 번에 봅니다.
for id in $(cat gone_ids.txt); do
t=$(wp post get "$id" --field=post_type 2>/dev/null) || t="없음"
echo "$id $t"
done
글이 없는 번호는 wp-cli 가 오류로 끝나므로 "없음"이 찍히고, 첨부 이미지가 쓰는 번호에는 attachment 가 찍힙니다. 살아 있는 글이나 페이지 번호가 목록에 섞여 있으면 post 나 page 가 찍히니, 그 번호도 목록에서 빼야 합니다.
하나 더 챙길 것이 있습니다. 라이브 서버의 플러그인 파일만 고치면 안 됩니다. 그 플러그인을 만들어 배포하는 원본 파일에도 같이 고쳐 넣어야 합니다. 원본이 그대로면 다음에 다시 설치할 때 빠진 번호가 되살아납니다.
확인 방법
목록을 고치고 다시 설치한 뒤, 남은 번호 전부와 빼낸 번호 전부를 다시 요청합니다. 몇 개만 골라 보면 이번처럼 일부만 어긋난 것을 놓칩니다.
for id in $(cat gone_ids.txt); do
code=$(curl -s -o /dev/null -w "%{http_code}" "https://example.com/?p=$id")
echo "$id $code"
done
- 목록에 남은 번호: 모두 410이어야 합니다.
- 빼낸 번호: 첨부 페이지로 정상 이동해야 합니다.
처음 설치했을 때도 몇 개만 열어 봤다면 410이 잘 나오는 것을 보고 끝냈을 것입니다. 26개 전부를 요청해 본 덕분에 7개가 어긋난 것을 알았습니다. 목록이 길어도 전수 확인은 반복문 하나면 되므로 아낄 이유가 없습니다.
다시 잰 결과 기대와 어긋난 번호는 0개였습니다. 결과를 "어긋남 0"으로 판정하는 검증 스크립트를 따로 두면 나중에 다시 돌려 보기도 쉽습니다.
상태 코드를 확인할 때 응답이 캐시에서 온 옛 결과일 수도 있습니다. 그런 경우는 고쳤는데 화면에 안 바뀔 때에서 다뤘습니다.
확인한 환경
| 항목 | 내용 |
|---|---|
| 프로그램 | 워드프레스, wp-cli, 410 응답용 자작 플러그인 |
| 확인한 날짜 | 2026년 9월 23일 |
같이 보면 좋은 글: wp-cli가 Success라는데 안 바뀌었을 때
이 글의 내용은 2026년 10월 5일에 마지막으로 확인했습니다. 틀린 곳을 발견하시면 연락처로 알려 주세요.