문제 상황
요청에 506 Variant Also Negotiates가 돌아옵니다. 실무에서 마주칠 가장 희귀한 상태 코드 중 하나죠. RFC 2295, 즉 실험적 투명 콘텐츠 협상 규격에 정의돼 있으며, 뜻은 딱 하나입니다: 서버가 리소스의 최적 버전을 고르려 했는데, 고른 그 버전이 또 협상되도록 설정돼 있어서 — 서버가 풀 수 없는 루프에 빠진 것입니다. 그래서 무한 재귀 대신 포기하고 506을 돌려줍니다.
콘텐츠 협상은 하나의 URL이 여러 표현을 서비스하는 메커니즘입니다 — page.html, page.fr.html, page.de.html을 클라이언트의 Accept-Language로 고르는 식이죠. 정상이라면 서버는 구체적 파일 하나를 골라 보냅니다. 506은 그 ‘최적’으로 고른 파일이 구체적 파일이 전혀 아니라, 또 다른 협상 대상 리소스라는 뜻입니다 — 서버가 자기 꼬리를 쫓고 있는 것이죠.
원인 TOP 3
- 또 다른 협상 대상을 가리키는 타입맵 — Apache
.var파일이, URI 자체가 협상 대상인 변형을 나열해, 그걸 고르면 협상이 다시 시작됩니다. - MultiViews 중첩 —
Options +MultiViews에서 최적 변형으로 뽑힌 파일이 다시 협상 규칙에 걸립니다(예:.var맵과 MultiViews 후보가 베이스 이름을 공유). 그래서 승자 자체가 협상 대상이 됩니다. - 협상 대상이 자기 자신을 대안으로 나열 — 변형 목록이 직접 또는 심링크/별칭을 통해 협상 중인 URL을 자기 선택지에 포함하는 경우입니다.
DechoNet 도구로 확인
- /util/http — 해당 엔드포인트가 정말 506을 돌려주는지 확인하고 응답 헤더를 살피세요. 콘텐츠 협상은 흔적을 남깁니다:
Vary,TCN(Transparent Content Negotiation), 변형을 나열하는Alternates헤더를 찾으세요. 이들이 그 URL에서 협상이 활성임을 알려주고, 서버 설정에서 되짚을 변형 이름을 줍니다.
해결 체크리스트
- 서버 설정에서 해당 리소스를 찾으세요 —
.var타입맵 파일, 또는Options +MultiViews가 걸린 디렉토리입니다. - 모든 변형이 구체적 표현(실제
page.en.html파일)을 가리키게 하세요. 자기가 다시 협상되는 URL을 절대 가리키지 않도록요. -
.var맵과 MultiViews가 같은 베이스 이름을 함께 덮고 있으면 하나를 끄세요 — 같은 파일 위에 둘 다 돌리는 게 루프를 만드는 전형적 방법입니다. - 변형 목록에서 별칭/심링크를 통해서라도 협상 중인 URL 자신으로 되돌아가는 항목을 제거하세요.
- URL을 다시 요청해 이제 단일 변형과 함께 200이 나오는지 확인하세요.
내 도메인에서 바로 확인
무료, 가입 불필요. 이 가이드가 다루는 항목을 바로 검사하고 조치 방법을 알려드립니다.