SSL 인증서를 설치한 후에는 모든 HTTP 트래픽을 HTTPS로 리다이렉트해야 합니다. 리다이렉트가 없으면 http://yourdomain.com에 접속하는 방문자는 HTTPS를 사용할 수 있더라도 암호화된 연결을 사용하지 않게 됩니다.
검색 엔진이 모든 순위 신호를 HTTPS URL로 전달하도록 301 (영구) 리다이렉트를 사용하세요.
Nginx
포트 80에 대한 별도의 server 블록을 추가하여 모든 요청을 리다이렉트합니다:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
이 설정은 전체 URL 경로를 유지합니다: http://example.com/page?q=1 → https://example.com/page?q=1.
편집 후 테스트하고 리로드합니다:
sudo nginx -t && sudo systemctl reload nginx
Apache
옵션 1: VirtualHost 리다이렉트 (권장)
Apache 설정에 추가합니다:
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
Redirect permanent / https://example.com/
</VirtualHost>
옵션 2: .htaccess (공유 호스팅)
VirtualHost 설정에 접근할 수 없는 경우(공유 호스팅), 사이트의 .htaccess에 추가합니다:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
mod_rewrite가 활성화되어 있어야 합니다.
변경 후:
sudo apachectl configtest && sudo systemctl reload apache2
리다이렉트 확인
# 301과 Location: https://...을 반환해야 함
curl -I http://yourdomain.com
예상 출력:
HTTP/1.1 301 Moved Permanently
Location: https://yourdomain.com/
HSTS: 이중 잠금
리다이렉트가 정상 작동하는 것을 확인한 후, HSTS(HTTP Strict Transport Security)를 추가합니다. 이는 사용자가 http://를 입력해도 브라우저가 항상 HTTPS를 사용하도록 지시합니다:
Nginx:
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
Apache:
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
처음에는 짧은 max-age(예: 300초)로 테스트한 후, 모든 것이 정상 작동하면 2년(63072000)으로 늘리세요.
경고: 긴
max-age로 HSTS가 활성화되면, HTTPS를 제거해도 브라우저가 HTTP를 통한 연결을 거부합니다. 긴 기간을 설정하기 전에 HTTPS 설정이 안정적인지 확인하세요.
일반적인 리다이렉트 패턴
www를 non-www + HTTPS로 리다이렉트
# Nginx: www → non-www, HTTP + HTTPS → HTTPS
server {
listen 80;
listen 443 ssl;
server_name www.example.com;
ssl_certificate /etc/ssl/fullchain.pem;
ssl_certificate_key /etc/ssl/privkey.pem;
return 301 https://example.com$request_uri;
}
non-www를 www + HTTPS로 리다이렉트
server {
listen 80;
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/ssl/fullchain.pem;
ssl_certificate_key /etc/ssl/privkey.pem;
return 301 https://www.example.com$request_uri;
}
전체 이전 도메인 리다이렉트
server {
listen 80;
listen 443 ssl;
server_name olddomain.com www.olddomain.com;
ssl_certificate /etc/ssl/old-fullchain.pem;
ssl_certificate_key /etc/ssl/old-privkey.pem;
return 301 https://newdomain.com$request_uri;
}
이전 도메인에도 유효한 SSL 인증서가 필요합니다 — 브라우저가 리다이렉트를 받기 전에 HTTPS를 설정해야 하기 때문입니다. 두 도메인을 모두 포함하는 SAN 인증서를 사용하거나, 이전 도메인에 별도의 인증서를 사용하세요.
문제 해결
리다이렉트 루프 (ERR_TOO_MANY_REDIRECTS)
HTTPS 서버 블록도 HTTPS로 리다이렉트하고 있는 경우에 주로 발생합니다. 포트 80 블록에만 리다이렉트가 있는지 확인하세요 — 포트 443 블록은 정상적으로 콘텐츠를 제공해야 합니다.
또 다른 원인: 로드 밸런서나 프록시(Cloudflare, AWS ALB)가 SSL을 종료하고 서버에 HTTP를 전달합니다. 서버는 HTTP를 감지하고 리다이렉트합니다. X-Forwarded-Proto 헤더를 확인하여 수정합니다:
# 프록시/로드 밸런서 뒤에 있는 경우
if ($http_x_forwarded_proto = "http") {
return 301 https://$host$request_uri;
}
검색 엔진에 캐시된 이전 HTTP URL
리다이렉트를 설정한 후 Google에 변경 사항을 알립니다:
<link rel="canonical">을https://로 업데이트- 사이트맵 URL을
https://로 업데이트 - Google Search Console에서 HTTPS 속성을 추가
Google은 301 리다이렉트를 따라가면서 점진적으로 색인된 URL을 업데이트합니다.
자주 묻는 질문
www를 non-www로(또는 그 반대) 동시에 리다이렉트해야 하나요?
네. 하나의 정규 형식을 선택하고 나머지를 리다이렉트하세요. 이렇게 하면 검색 엔진에서 중복 콘텐츠를 방지할 수 있습니다:
# www를 non-www로 리다이렉트 (Nginx)
server {
listen 80;
listen 443 ssl;
server_name www.example.com;
return 301 https://example.com$request_uri;
}
리다이렉트가 SEO에 영향을 미치나요?
301 리다이렉트는 대상 URL에 순위 신호를 전달합니다. Google은 HTTP에서 HTTPS로의 마이그레이션에 301 리다이렉트를 권장합니다. 일시적으로 약간의 변동이 있을 수 있지만, HTTPS 순위 신호 덕분에 장기적으로 SEO가 개선됩니다.
리다이렉트 후 혼합 콘텐츠는 어떻게 하나요?
리다이렉트는 페이지 URL을 처리하지만, HTML에서 리소스(이미지, 스크립트, CSS)를 http:// URL로 참조하면 브라우저가 차단하거나 경고를 표시합니다. 혼합 콘텐츠 해결 가이드를 참고하세요.
리다이렉트가 올바르게 작동하는지 테스트하려면?
# 리다이렉트 체인 확인
curl -ILs http://yourdomain.com | grep -E '^HTTP|^Location'
예상 출력:
HTTP/1.1 301 Moved Permanently
Location: https://yourdomain.com/
HTTP/2 200
첫 번째 응답은 HTTPS Location이 포함된 301이어야 하고, 마지막 응답은 200이어야 합니다.
DNS 수준에서 리다이렉트해야 하나요, 서버 수준에서 해야 하나요?
서버 수준(Nginx/Apache 설정 또는 .htaccess)에서 하세요. DNS 수준 리다이렉트(예: Cloudflare의 Page Rules)는 작동하지만 네트워크 홉이 추가되고 리다이렉트 동작에 대한 제어가 적습니다. 서버 수준 리다이렉트가 더 빠르고 안정적입니다.