Url Redirect 301 vs 302

사이트를 새로운 도메인으로 옮겼다던가 페이지의 주소가 바뀌었을때 사용자들을 자동으로 바뀐 주소로 옮겨가게 만드는데는 두가지 방법이 있다.

301 redirect는 영구적으로 옮겼을 때
302 redirect는 일시적으로 옮겼을 때 사용한다.

301 permanent redirect와 302 temporary redirect 이다. 301과 302는 사용자가 브라우저를 통해 웹서버에 요청했을때 돌려받는 웹서버의 상태코드이다. 301은 요청한 정보가 새로운 주소로 영구적으로 옮겨갔다는것을 말해주며 302는 일시적으로 옮겨갔다는것을 말해준다. 표면상으로는 둘다 자동으로 사용자를 옮겨가게 만드니 사람의 육안으로는 구별할수 없으나 검색엔진은 그 차이를 알수 있고, 이 두가지가 검색엔진 최적화에 미치는 영향은 꽤 크다.

301 permanent redirect

이것은 말그대로 요청한 정보(사이트나 페이지)가 영구적으로 옮겼다는 것을 말해준다. 크롤러가 aaa.com에 접속했을때 aaa.com에서 인덱스한 내용의 주소가 bbb.com으로 바뀌었다는것을 감지하고 인덱스된 aaa.com의 주소를 자동으로 bbb.com으로 변경시켜 준다.

검색엔진 최적화에는 301 redirect 추천

302 temporary redirect

302 redirect는 현재 페이지나 사이트를 일시적으로만 옮겼다는 것을 말해준다. 대부분 javascript를 이용한 redirect, 메타태그(

< meta http-equiv="refresh" content="0;url=http://새로운주소.com" />

)를 이용한 redirect 또는 각각의 프로그래밍 언어를 사용한 단순 redirect가 이에 포함된다.

302 redirect를 해주게 되는 경우 사용자는 자동으로 옮겨가게 되지만, 크롤러는 사이트가 옮겨갔다는 것을 감지하더라도 일시적으로만 옮겨간 것으로 간주하기 때문에 검색결과에 아무런 변화를 주지 않게 된다. 그래서 특정 키워드로 검색을 했을때 aaa.com이 나오던것이 bbb.com으로 업데이트되지 않게 된다.

간혹 이것을 악용하여 특정 키워드로 최적화된 페이지를 방문한 사용자를 자동으로 페이지와 전혀 상관없는 광고성 페이지로 옮겨가게 만드는 경우도 있다.

구글은 이를 doorway page로 여겨 페널티를 부과하기 때문에 대부분의 경우 302 보다 301 redirect를 사용하는 것을 추천한다.

html

<html>
<head>
<meta http-equiv="Refresh" content="0; url=http://www.example.com/" />
</head>
<body>
<p>Please follow <a href="http://www.example.com/">this link</a>.</p>
</body>
</html>

php

header('HTTP/1.1 301 Moved Permanently');
header('Location: http://www.example.com/');
exit();

PHP로 redirect하기 참조.

nginx

강제. 항상.

server { 
  server_name old.com; 
  return 301 $scheme://new.com$request_uri;
}

http 에서 https로 301

server {
	listen 80;
	server_name example.com;
	root html;
 
	location / {
        return 301 https://example.com$request_uri;
    }
}
 
server {
	listen 		 443 ssl https;
    server_name  example.com
    root         html;
 
    ssl                  on;
    ssl_certificate      /etc/pki/tls/certs/example.com.chained.crt;
    ssl_certificate_key  /etc/pki/tls/private/example.com.key;
    ssl_session_timeout  5m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers  ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    ssl_prefer_server_ciphers   on;
    location ~ /\.ht {
         deny  all;
    }
}

역링크