308 Permanent Redirect
사용법
308 Permanent Redirect 상태 코드를 받으면 클라이언트는 저장해 둔 링크를 새 URI로 갱신해야 합니다. 새 URI는 Location 헤더로 지정되며, 클라이언트는 이를 사용해 자동으로 리다이렉트합니다.
이 응답은 서버가 새 도메인으로 이전하거나 내부 파일 구조를 재편하면서 이전 URI로 되돌릴 계획이 없을 때 흔히 쓰입니다.
308 Permanent Redirect 상태 코드는 한 가지 중요한 점에서 301과 다릅니다. 클라이언트가 원래 요청 메서드를 반드시 보존해야 한다는 점입니다. 301 응답은 리다이렉트 시 클라이언트가 POST 요청을 GET 요청으로 바꾸는 것을 허용합니다. 308 Permanent Redirect는 후속 요청이 원래와 동일한 메서드를 사용하도록 요구합니다. 그래서 API 엔드포인트나 폼 제출처럼 메서드 보존이 중요한 경우에는 308이 올바른 선택입니다. 308 상태 코드는 원래 별도의 명세로 정의되었다가 이후 핵심 HTTP 표준에 통합되었습니다.
SEO 영향
Google은 308을 301과 동일하게 취급합니다. 둘 다 영구 리다이렉트이며 리다이렉트 대상이 정규 URL이라는 강한 신호입니다. 순위 신호는 이전 URL에서 새 URL로 이전됩니다. Google은 최대 10단계의 리다이렉트를 따라갑니다. 중간 리다이렉트 URL의 콘텐츠는 무시됩니다. 301과 308의 유일한 차이는 메서드 보존이며, 이는 API 엔드포인트에는 중요하지만 검색 엔진 크롤링에는 그렇지 않습니다. 삭제된 URL을 308로 홈페이지나 일반적인 카테고리 페이지로 리다이렉트하면 Google은 이를 소프트 404로 감지합니다.
예시
클라이언트가 API 엔드포인트에 POST 요청을 보냅니다. 서버는 해당 엔드포인트가 이동했음을 알리기 위해 308 Permanent Redirect로 응답합니다. 클라이언트는 원래 본문을 포함한 POST 요청을 새 Location으로 다시 보내야 합니다.
요청
POST /api/v1/orders HTTP/1.1
Host: example.com
Content-Type: application/json
Content-Length: 35
{"item": "widget", "quantity": 10}
응답
HTTP/1.1 308 Permanent Redirect
Location: http://example.com/api/v2/orders
Content-Type: text/html; charset=UTF-8
Content-Length: 118
<h1>API endpoint moved</h1>
<body>
The orders endpoint has moved to
<a href=/api/v2/orders>/api/v2/orders</a>.
</body>
코드 참고
.NET
HttpStatusCode.PermanentRedirect
Rust
http::StatusCode::PERMANENT_REDIRECT
Rails
:permanent_redirect
Go
http.StatusPermanentRedirect
Symfony
Response::HTTP_PERMANENTLY_REDIRECT
Python3.5+
http.HTTPStatus.PERMANENT_REDIRECT
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_PERMANENT_REDIRECT
Angular
@angular/common/http/HttpStatusCode.PermanentRedirect