본문 바로가기
프로그래밍/스프링프레임워크

Servlet/jsp, PHP, Javascript로 리다이렉트하기(HTTP 응답코드 지정)

by pentode 2018. 4. 20.

웹프로그램시 사이트의 도메인이 바뀌거나 어떠한 조건에 의해 특정 페이지로 리다이렉트를 해야할 경우가 있습니다. 이번에는 Servlet/jsp, PHP, Javascript, HTML meta 태그등을 사용하여 리다이렉트를 하는 방법을 알아 봅니다.


리다이렉트시 나타나는 HTTP 응답코드는 301, 302, 200 등이 있을 수 있습니다. 301은 영구적으로 URL이 변경되었음을 나타내는 응답코드이고, 302 는 일시적으로 URL이 변경되었음을 나타내는 것입니다.


자바스트립트나 메타 태그를 이용하여 리다이렉트하면 응답코드가 200이 나옵니다. 정상적인 요청에 대한 응답과 동일합니다. 자바스크립트를 이용한 리다이렉트는 검색로봇이 페이지 수집을 하는데 크롤링을 어렵게 하는 경우가 있다고 합니다.


자주 사용하는 언어별로 리다이렉트 하는 방법과 가능하다면 응답코드를 지정하는 방법을 알아보겠습니다.



1. Servlet/jsp 에서 리다이렉트 하기


HttpServletResponse 객체의 sendRedirect() 메소드를 사용하여 리다이렉트합니다. 기본적으로 응답코드는 302 입니다.


// 다른 사이트로 리다이렉트 할 수 있습니다.

response.sendRedirect("http://offbyone.tistory.com");


// 같은 사이트내의 URL로 리다이렉트 합니다.

response.sendRedirect(request.getContextPath() + "/home.do");



HTTP 301 응답코드로 리다이렉트 하려면 다음과 같이 합니다.


response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);

response.setHeader("Location", request.getContextPath() + "/home.do");


response.sendRedirect()나 response.setHeader() 를 사용할 때 주의할 점은 이 코드 아래쪽에 다른 코드들이 있으면 실행된다는 것입니다. 어떤 조건에 따라 리다이렉트하려는 경우 retunr; 문으로 바로 빠져 나오거나 if/else 문을 사용하여 다른 코드가 실행되지 않도록 하여야 하겠습니다.




2. 자바스크립트로 리다이렉트하기


자바스크립트를 통한 리다이렉트는 HTTP 200 응답코드를 냅니다.


<script type="text/javascript">

//<![CDATA[

window.location.href = "http://offbyone.tistory.com";

//]]>

</script>


window는 생략 가능합니다. 즉, location.href = ""; 처럼 사용해도 됩니다.



3. 메타 태그를 이용한 리다이렉트


메타태그를 이용한 리다이렉트는 HTTP 200 응답코드를 냅니다.


// 5초 후 자신의 페이지를 다시 요청합니다.

<meta http-equiv="refresh" content="5">


// 5초 후 url 을 호출합니다.

<meta http-equiv="refresh" content="5; url='/pentode/home.do'" />



4. PHP 에서 리다이렉트 사용하기


PHP에서 아래와 같이 사용하면 기본적으로 HTTP 302 응답코드로 실행됩니다.


// 다른 사이트로 이동

header("Location: http://offbyone.tistory.com");


// 같은 사이트내에서 이동

header("Location: /pentode/home.php");


HTTP 301 응답코드를 내도록 하려면 다음과 같이 합니다.


header("Location: /pentode/home.php", true, 301);


두 번째 인자는 앞서 설정된 같은 헤더를 교체할 것인지 그냥 추가할 것인지를 지정합니다. true 이면 교체합니다. 세 번째 인자가 응답코드를 지정합니다.


PHP의 header() 함수도 뒤에 나오는 코드가 실행되기 때문에 exit() 를 사용해서 바로 종료하던가 if/else 등을 사용해서 추가로 코드가 실행되지 않도록 해야겠습니다.

반응형