HTTP to HTTPS Migration: The Complete Checklist
Moving a site from HTTP to HTTPS should be boring. It usually isn't. This checklist is the one I wish I'd had the first time — the steps, the order, and the things that break if you skip them.
Before you touch production
- Inventory every hostname. apex, www, subdomains, CDN origins, API endpoints. Anything that needs to work over HTTPS needs a certificate.
- Audit third parties. Analytics, ads, fonts, image CDNs, embedded widgets. Anything loaded over
http://will become mixed content. - Grep your source.
grep -rn "http://" .— look for hardcoded HTTP URLs in templates, CSS, config, and the database. - Check your CDN. If you're behind Cloudflare, Fastly, or CloudFront, understand how origin-to-edge SSL works before you flip the switch. The ERR_TOO_MANY_REDIRECTS trap is almost always a Cloudflare Flexible SSL misconfiguration.
Certificate setup
You have three options, in increasing order of control:
- CDN-managed (Cloudflare, Vercel, Netlify). Free, auto-renewing, zero config. Best for most sites.
- Let's Encrypt via certbot. Free, auto-renewing, but you manage the renewal cron. Standard for self-hosted Nginx/Apache.
- Commercial cert. Needed only if you require EV, wildcard + multi-domain combos that Let's Encrypt doesn't cover, or legal compliance.
Whichever you pick: test with curl -v https://yourdomain before moving on. You should see a clean chain, no warnings.
Server-side redirects
Redirect every HTTP request to HTTPS with a 301. Send the client once, cache it forever.
Nginx
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}Apache
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]Behind a proxy (Cloudflare, ALB, Heroku)
Your server sees HTTP from the proxy even when the client used HTTPS. Check X-Forwarded-Proto instead:
# Nginx
if ($http_x_forwarded_proto != "https") {
return 301 https://$host$request_uri;
}Fix mixed content
Mixed content is when an HTTPS page loads an HTTP resource. Browsers block scripts and iframes outright; they downgrade the padlock for images. Find and fix every instance.
- Open the site over HTTPS, pop the browser console, look for "Mixed Content" warnings.
- Use
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">as a temporary catch-all, but still fix the root cause. - Update hardcoded URLs in your database — especially CMS content like WordPress posts, which often have absolute
http://image URLs.
Warning — don't blindly run UPDATE ... REPLACE on WordPress tables.
WordPress stores widget settings, theme customizer values, and many plugin options as serialized PHP in wp_options and wp_postmeta. Serialized strings embed their own byte lengths (e.g. s:18:"http://example.com"), so a naïve SQL replace changes the text but leaves the length field wrong, and PHP's unserializer silently drops the broken blob. The safe fix is a serialization-aware tool: use WP-CLI's wp search-replace 'http://example.com' 'https://example.com' --all-tables or the Search Replace DB script. The raw UPDATE below is only safe for siteurl and home — skip the wp_posts and wp_postmeta statements unless you're certain nothing serialized touches those URLs.
# Safe approach: use WP-CLI (handles serialized PHP correctly)
wp search-replace 'http://example.com' 'https://example.com' --all-tables --precise
# Raw SQL is only safe for siteurl/home (plain strings, not serialized).
# DO NOT run REPLACE on wp_posts or wp_postmeta without a serialization-aware tool.
UPDATE wp_options SET option_value = REPLACE(option_value, 'http://example.com', 'https://example.com') WHERE option_name IN ('siteurl', 'home');Third-party services to update
- Google Search Console. Add the HTTPS property as a new property, then submit the new sitemap.
- Google Analytics. Update the default URL in View Settings.
- Ads platforms. Google Ads, Facebook Ads, etc. Update destination URLs to avoid an extra redirect hop.
- Webhooks and callbacks. OAuth redirect URIs, payment webhooks, API callback URLs — update them all to HTTPS.
- Email marketing tools. Update the unsubscribe and tracking domains.
Canonical URLs and sitemaps
- Update
<link rel="canonical">in every template to use HTTPS. - Regenerate sitemap.xml with HTTPS URLs.
- Update robots.txt
Sitemap:directive. - Check
hreflangtags — they're a classic "oops, still pointing at HTTP" artifact.
HSTS — the one-way door
HSTS (HTTP Strict Transport Security) tells browsers to never talk to your site over HTTP again, even if the user types http://. It's a security win and a rollback hazard. Roll it out carefully:
# Phase 1: short max-age (verify nothing breaks)
Strict-Transport-Security: max-age=300
# Phase 2: one week
Strict-Transport-Security: max-age=604800
# Phase 3: one year + subdomains (only after full validation)
Strict-Transport-Security: max-age=31536000; includeSubDomains
# Phase 4: submit to browser preload list (IRREVERSIBLE)
Strict-Transport-Security: max-age=63072000; includeSubDomains; preloadDo not jump straight to preload. If you ever need to downgrade a subdomain to HTTP, you'll be waiting months to get removed from the preload list.
Post-launch checklist
- Run SSL Labs on every hostname. Aim for A or A+.
- Crawl with Screaming Frog or a similar tool to find remaining HTTP links.
- Check Search Console daily for the first two weeks — watch for crawl errors and index status.
- Check your analytics referrer data. A big drop in referral traffic can mean the referring site hasn't updated links, or an intermediate redirect is stripping the referrer.
- Verify your redirect chain is exactly one hop:
http://old→https://new. Two hops is a performance tax and an SEO dilution risk. Use Redirect Check to confirm.
The short version
- Get the certificate working on staging first.
- Fix mixed content before flipping the switch.
- Add the 301 HTTP→HTTPS redirect.
- Update every third-party service that references your domain.
- Roll HSTS out gradually — short max-age, then long, then preload.
- Verify no redirect chains and monitor Search Console for a few weeks.
지금 리디렉션을 검사하세요
잘못된 리디렉션이 SEO에 피해를 주지 않도록 하세요. 무료 도구로 링크를 즉시 감사하세요.
How to Fix ERR_TOO_MANY_REDIRECTS: A No-BS Troubleshooting Guide
Stuck in a redirect loop? Learn how to diagnose and fix the ERR_TOO_MANY_REDIRECTS error with practical solutions for WordPress, Cloudflare, Apache, and Nginx.
Setting Up Redirects in Cloudflare: A No-Nonsense Guide for 2025
Master Cloudflare redirects with this practical guide. Learn Single Redirects, Bulk Redirects, common pitfalls, and real troubleshooting tips that actually work.
Mobile-First Redirects: How to Optimize for Core Web Vitals in 2025
Learn how redirects impact Core Web Vitals and mobile performance. Practical strategies to maintain LCP, INP, and CLS scores during redirects.