Nginx 설정파일의 server블록 안에 다음과 같은 구문을 추가하면 해당 가상 서버로 접속한 사용자를 지정한 주소로 자동 Redirection 시킬 수 있습니다.
return 301 {Redirection 주소};
여기서 301은 HTTP Status Code로, 영구 이동(Permanently moved)을 의미합니다. 즉, "네가 요청한 페이지가 영구히 이전되었으므로 이 주소로 다시 접속을 시도해 봐라."라는 의미입니다.
301대신 302를 쓰면 임시 이동(Temporary moved)을 의미하며, "유지/보수/점검 등의 이유로 요청한 페이지가 잠시 다른 주소로 옮겨졌으며, 이번에는 이 주소로 접속을 시도하고 다음번에는 원래 주소로 접속하라."는 의미입니다.
브라우저에서 301/302 HTTP Status Code를 수신하면 지정된 주소로 다시 요청을 보내게 됩니다.
어차피 브라우저를 통해 접속한 사용자의 입장에서는 301이나 302나 지정한 주소로 Redirection되는 것은 똑같지만, 접속을 시도한 사용자가 사람이 아니라 웹 크롤러와 같은 Bot인 경우에 대비해서 이 차이를 정확히 명시해 주어야 합니다.(예를 들어, 웹 크롤러가 301을 반환받았다면 검색엔진의 Indexing된 주소를 수정할 것입니다.)
이 Redirection은 접속하려는 사용자에게 HTTPS를 통한 접속을 강제하려 할 때에도 유용하게 사용할 수 있습니다. 예를 들어, 다음과 같이 설정파일을 작성하면 http://tuwlab.com 으로 접속하려는 사용자를 https://tuwlab.com 으로 강제 Redirection 시킵니다.
server { listen 80; server_name tuwlab.com; return 301 https://$server_name$request_uri; }
뭐, 다음과 같이 스크립트를 통해서 수동으로 Redirection을 해 줄 수도 있지만,
<script> document.location.href = "{Redirection 주소}"; </script>
이 경우 페이지를 이동하는 과정에 사용에게 순간적으로 노출이 되고, 자바스크립트를 꺼 놓은 경우 흰색의 빈 화면만 달랑 표시되고 아무 일도 일어나지 않게 됩니다. 더 큰 문제점은 이런 식으로 Redirection을 하면 검색엔진에서 크롤링을 하지 않거나, 스팸 사이트로 분류할수도 있다는 점입니다.
따라서 이동된 페이지에 대해서는 HTTP Status Code를 사용해서 정확히 무슨 일이 일어났는지 Client측에 알려주도록 해야 합니다.