워드프레스 지운 글에 410을 걸었는데 301이 나올 때

결론부터
증상: 지운 글 번호에 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일에 마지막으로 확인했습니다. 틀린 곳을 발견하시면 연락처로 알려 주세요.