HTTPS that is missing, not enforced or has certificate problems
Serve every page over HTTPS with a valid certificate that covers both your www and non-www addresses, and permanently redirect every http:// address to its https:// twin. Then change resource, link and form addresses on your pages from http:// to https://, renew the certificate automatically before it expires and allow only TLS 1.2 and 1.3. Shopify, Wix and Squarespace issue certificates for you.
Why it matters
HTTPS encrypts the connection between a visitor's browser and your site. When a page exists at both an http:// and an https:// address, Google prefers to index the HTTPS one, and Search Console's HTTPS report lists the reasons it could not: an invalid certificate, an HTTPS address that redirects to HTTP, an HTTP page named as canonical, or a sitemap that points to HTTP. Google treats moving from HTTP to HTTPS as a site move: it recommends permanent 301 or 308 redirects, internal links changed to the new addresses and sitemaps updated.
Do not expect a ranking jump from HTTPS alone. Google's page experience guide lists secure serving among the questions to ask about your pages, and says that page experience aspects other than Core Web Vitals do not directly help a site rank higher. The reasons to fix it are what visitors' browsers do, and the second copy of every page that plain HTTP leaves open.
An HTTPS page that loads an image, script, stylesheet or frame over http:// has mixed content. Browsers block scripts, stylesheets, frames, srcset images and fonts loaded that way, and retry plain images, audio and video over https://, so anything without an https:// copy fails to load. A form on a secure page that sends to an http:// address makes browsers show a security warning each time someone submits it.
A certificate has an end date, after which browsers show visitors a security error instead of your page. Let's Encrypt, the free certificate authority, issues 90-day certificates by default; that falls to 64 days on 10 February 2027 and 45 days on 16 February 2028, and Let's Encrypt has ended its expiry reminder emails. Renewal has to be automatic, and checked.
TLS 1.0 and 1.1 are retired: RFC 8996 says they must not be used, and Chrome removed them in version 84. A certificate also covers only the names listed in it, so example.com and www.example.com both need to be in it: a visitor who types the missing one gets a security error before any redirect can run.
HSTS, the Strict-Transport-Security header, tells a browser that has seen it once to use only HTTPS for your site from then on, and not to let visitors click through certificate errors. Browsers ignore it when it arrives over plain HTTP.
SERPCompass rates pages served over plain HTTP, a site with no working HTTPS and a certificate that has expired or expires within 7 days as critical. An http:// address that does not redirect, mixed content, forms that send to http://, a certificate expiring within 30 days, a www or non-www twin with an invalid certificate and TLS below 1.2 are warnings; http:// internal links and a missing HSTS header are notices. For short-lived certificates the 30 and 7 days shrink to a third and a sixth of the certificate's lifetime. These thresholds are ours.
The audit findings this guide fixes: Pages served over plain HTTP; Site has no working HTTPS; HTTP version does not redirect to HTTPS; Mixed content (HTTP resources on HTTPS pages); Internal links to HTTP URLs; Forms that submit to HTTP; Missing HSTS header; TLS certificate expires within 30 days; TLS certificate expires within 7 days; Outdated TLS version (below TLS 1.2); The www or non-www address has an invalid certificate.
Find every page with this problem
Run the free scan on your domain. It notes every page it crawls over plain HTTP, requests the http:// address of your start page to see whether it redirects to https://, reads each HTTPS page for images, scripts, stylesheets, frames, media, links and form actions that use http://, checks the HSTS header on the first HTTPS page, and opens a TLS connection to read the certificate's expiry date, the TLS version the server agrees to and whether the www or non-www form of your domain has a valid certificate. The Gap Report and a SERPCompass workspace list the affected pages and the http:// addresses on each. To check by hand, run curl -sI http:// followed by your domain: the first line should be a 301 or 308 and the location line an https:// address. Your browser's developer tools console lists mixed content on the page you have open. In Google Search Console, the HTTPS report shows how many of your indexed pages are HTTP and why.
How to fix it on your platform
WordPress (no SEO plugin)
- Get a certificate from your host for both your domain and its www form; WordPress works over HTTPS once the web server has one.
- Go to Tools > Site Health. From WordPress 5.7, when your server already supports HTTPS, the HTTPS status there offers a button that switches the WordPress Address and Site Address to https:// in one step, and switches back if HTTPS then fails.
- Or go to Settings > General, change WordPress Address (URL) and Site Address (URL) to start with
https://and click Save Changes. If the fields are greyed out,WP_SITEURLandWP_HOMEinwp-config.phpset them: change them there. - After the switch, WordPress rewrites http:// addresses on your own domain as pages are shown in post content, excerpts, text widgets and custom CSS, without changing what is stored. Any other place that stores a full http:// address, such as a custom menu link or a theme setting, needs changing by hand.
- Redirect http:// to https:// in your web server's configuration (Apache or NGINX below) or your host's control panel, and check it with
curl -sI.
Sources: HTTPS (WordPress advanced administration handbook); Site Health screen (WordPress documentation); Improved HTTPS detection and migration in WordPress 5.7 (Make WordPress Core); Settings General screen (WordPress documentation).
Shopify
- Shopify issues free TLS certificates for your myshopify.com address, for domains bought or transferred through Shopify, and for other domains connected by pointing their A and CNAME records at Shopify. You cannot install a certificate of your own.
- After connecting a domain from another provider, allow up to 48 hours. On the Domains page its status should read Connected, and a padlock should show beside your store's address. Shopify then redirects visitors from http:// to the encrypted store.
- If the admin shows SSL unavailable, check your domain's CAA records. You need none unless you are required to use them; if you have them, each must allow
letsencrypt.org,pki.goog; cansignhttpexchanges=yesandssl.com. - Shopify treats a page that loads any asset not delivered over HTTPS as insecure. Host images and files on Shopify, or serve them, webfonts included, over HTTPS from wherever they live.
- In descriptions, pages and blog posts, change http:// links to your own store into links that start with
/, such as/collections/summer-collection, which Shopify recommends for links within your store.
Sources: Secure connections (Shopify Help Center); Using the rich text editor (Shopify Help Center).
Wix
- All Wix sites run on HTTPS with a certificate Wix provides; Wix does not support certificates from other providers.
- If your domain shows a certificate error, check its DNS records in Wix's troubleshooting article: with Wix's name servers, keep the default A and CNAME records; when pointing, the A record is for
@and the CNAME forwww. After a DNS change, allow up to 48 hours. - For a domain bought outside Wix, ask your domain host to make sure DNSSEC is not signed for it.
- If an HTML element on a page contains code with http:// addresses, click it, click Edit Code, remove them or replace them with https:// and click Publish.
Sources: Request: third-party SSL certificates (Wix Help Center); Troubleshooting your SSL certificate (Wix Help Center).
Squarespace
- Squarespace protects every domain correctly pointed at your site with a free certificate, one for each custom domain and subdomain, including the www form if you use it separately.
- Open the SSL panel, choose Secure (Preferred) under Security preference, keep HSTS Secure on and click Save. Secure sends visitors to HTTPS once the certificate is issued; Insecure leaves both HTTP and HTTPS open, and domains connected before October 2016 start on Insecure.
- Mixed content on Squarespace comes from integrations, code-based customisations and custom code: edit each one so it loads over https://.
Source: Understanding SSL certificates (Squarespace Help Center).
Let's Encrypt with Certbot
- With shell access to your server, Let's Encrypt recommends the Certbot client. Without it, your host gets and manages the certificate for you, automatically or once you turn on a setting.
- Request one certificate that names both forms of your domain, such as
certbot certonly -d example.com -d www.example.com. Certbot's--apacheand--nginxplugins obtain the certificate and install it in that server. - To add a missing name to an existing certificate, name the certificate and list every domain it should cover:
certbot certonly --cert-name example.com -d example.com,www.example.com. - Most Certbot installations schedule
certbot renewfor you: look for it withsystemctl list-timersor in your crontab, and test it withcertbot renew --dry-run. From Certbot 4.0, a certificate is renewed when less than a third of its lifetime remains. - Do not renew on a fixed 60-day timer: Let's Encrypt says that will not be enough once certificates last 45 days. And since it no longer emails expiry reminders, watch the expiry date yourself.
Sources: Getting started (Let's Encrypt); FAQ (Let's Encrypt); User guide (Certbot documentation); Decreasing certificate lifetimes to 45 days (Let's Encrypt); Expiration email service shut down (Let's Encrypt).
Apache
- Redirect HTTP in a dedicated port 80 virtual host with
Redirect permanent "/" "https://www.example.com/". Apache's documentation prefers this tomod_rewrite. - Only if you cannot edit the server configuration, use
mod_rewritein.htaccessinstead (see the examples). - In the HTTPS virtual host, send HSTS with
Header always set Strict-Transport-Security "max-age=31536000";alwaysadds it to error responses too. - Allow only current TLS versions with
SSLProtocol TLSv1.2 TLSv1.3(TLS 1.3 needs OpenSSL 1.1.1 or later).
Sources: Redirecting and remapping with mod_rewrite (Apache HTTP Server); mod_headers (Apache HTTP Server); mod_ssl (Apache HTTP Server).
NGINX
- Answer plain HTTP in its own
serverblock that listens on port 80 and returnsreturn 301 https://www.example.com$request_uri;. - In the HTTPS
serverblock, which listens withlisten 443 ssl;, setssl_protocols TLSv1.2 TLSv1.3;. - Add HSTS with
add_header Strict-Transport-Security "max-age=31536000" always;. Alocationblock withadd_headerlines of its own does not inherit this one: repeat it there. - A certificate for both names goes in
ssl_certificateandssl_certificate_key, with both names in its SubjectAltName field.
Sources: Module ngx_http_rewrite_module (nginx); Module ngx_http_core_module (nginx); Configuring HTTPS servers (nginx); Module ngx_http_ssl_module (nginx); Module ngx_http_headers_module (nginx).
Plain HTML
- Change every resource address that starts with
http://tohttps://: thesrcof images, scripts, frames, audio, video andsourceelements,srcset, and stylesheet and icon links. Check that the file loads over https:// first. - For files on your own site, a relative address such as
/images/van.jpgloads over the page's own connection. - Change internal links that start with
http://tohttps://or to relative paths, so no link passes through the redirect. - Change every form
actionthat starts withhttp://tohttps://. - On many pages, change addresses with a script rather than by hand, and include stylesheets, scripts and redirect rules, not only the HTML.
- Open the browser's developer tools console on each page: browsers report mixed content there.
Content-Security-Policy: upgrade-insecure-requestsmakes browsers fetch what is left over https://; it is a safety net, not a replacement for fixing the addresses.
Sources: Fixing mixed content (web.dev); Mixed content (MDN); Enable HTTPS on your servers (web.dev); Sending form data (MDN); Site moves with URL changes (Google Search Central).
Examples
-
Bad
<img src="http://www.example.com/images/van.jpg" alt="Our service van">On an HTTPS page this is mixed content: the browser retries it over https:// and shows nothing if that fails.
-
Good
<img src="/images/van.jpg" alt="Our service van">A relative address loads over the page's own HTTPS connection.
-
Bad
<form action="http://www.example.com/contact" method="post">Browsers warn the visitor each time they send it, because the data is not encrypted.
-
Bad
$ curl -sI http://www.example.com/ HTTP/1.1 200 OK Content-Type: text/htmlThe http:// address answers with the page itself, not a redirect, so both copies stay open.
-
Good
<VirtualHost *:80> ServerName www.example.com Redirect permanent "/" "https://www.example.com/" </VirtualHost>Apache's recommended redirect: one permanent hop to the https:// address.
-
Good
RewriteEngine On RewriteCond "%{HTTPS}" !=on RewriteRule "^(.*)" "https://%{SERVER_NAME}$1" [R=301,L]The
.htaccessversion, for when you cannot edit the server configuration. -
Good
server { listen 80; server_name example.com www.example.com; return 301 https://www.example.com$request_uri; }Both http:// names go straight to the https:// host you chose, keeping the path.
-
Good
Strict-Transport-Security: max-age=31536000; includeSubDomainsOne year, subdomains included. Add
includeSubDomainsonly when every subdomain works over HTTPS.
Common mistakes
- Installing a certificate but leaving http:// open: without a permanent redirect, both copies of every page stay reachable.
- Redirecting with a temporary 302 instead of a permanent 301 or 308, which Google recommends for a move from HTTP to HTTPS.
- Covering only one of
example.comandwww.example.comwith the certificate, so visitors and links that use the other get a security error. - Fixing image and script addresses but forgetting form actions,
srcsetand the addresses inside stylesheets. - Leaving http:// addresses in your sitemap and canonical tags after the move: Search Console names both among the reasons an HTTPS page is not indexed.
- Sending HSTS with
includeSubDomainsorpreloadbefore every subdomain works over HTTPS. hstspreload.org warns that the preload list cannot easily be undone: removal takes months to reach Chrome users. - Trusting renewal to run on its own. A renewal job that fails silently is found only when the certificate expires: test it with
certbot renew --dry-runand watch the expiry date.
Questions and answers
Does HTTPS improve my Google rankings?
Not directly. Google lists secure serving among the page experience questions to ask about your pages, but says that aspects other than Core Web Vitals do not directly help a site rank higher. It does prefer to index the HTTPS version of a page that exists at both addresses. Fix HTTPS so every page has one address, and because browsers block mixed content and warn about insecure forms.
What is mixed content and how do I fix it?
Mixed content is an HTTPS page that loads an image, script, stylesheet, frame or other file over http://. Browsers block most of it and retry plain images, audio and video over https://. Change each address to https://, or to a relative path for your own files, once the file loads over HTTPS. The browser's developer tools console lists what is left.
How do I stop my SSL certificate from expiring?
Let a tool renew it automatically, and check that the renewal works. Shopify, Wix and Squarespace manage certificates for you. On your own server, Certbot schedules renewals, and certbot renew --dry-run tests them. Let's Encrypt certificates last 90 days today and 45 days from February 2028, and Let's Encrypt no longer emails expiry reminders, so watch the date yourself.
Why does the www version of my site show a security error?
The certificate does not name that host. A certificate covers only the names listed in it, so example.com and www.example.com both need to be in it. Add the missing name, for example with Certbot's cert-name option, or point both DNS records at your site builder so it can issue one, then redirect one form to the other.
Should I add my site to the HSTS preload list?
Only when every subdomain works over HTTPS and will stay that way. The list requires a valid certificate, a redirect from HTTP on the same host and an HSTS header with a max-age of at least one year, includeSubDomains and preload. hstspreload.org warns that inclusion cannot easily be undone: removal takes months to reach Chrome users.
More guides
- Redirect chains, loops and other redirect problems
- Broken links to pages that answer an error
- XML sitemaps that are missing, unreadable or list the wrong pages
- Canonical tags that are missing, conflicting or pointing at the wrong URL
- All guides
- Free tools: checks for robots.txt and llms.txt that need no account.
Sources
- HTTPS report (Search Console Help)
- Site moves with URL changes (Google Search Central)
- Understanding page experience in Google Search results (Google Search Central)
- Enable HTTPS on your servers (web.dev)
- What is mixed content? (web.dev)
- Fixing mixed content (web.dev)
- Mixed content (MDN)
- Strict-Transport-Security header (MDN)
- Sending form data (MDN)
- HSTS preload list submission (hstspreload.org)
- RFC 8996: Deprecating TLS 1.0 and TLS 1.1 (IETF)
- Deprecations and removals in Chrome 84 (Chrome for Developers)
- Getting started (Let's Encrypt)
- FAQ (Let's Encrypt)
- Decreasing certificate lifetimes to 45 days (Let's Encrypt)
- Expiration email service shut down (Let's Encrypt)
- User guide (Certbot documentation)
- Redirecting and remapping with mod_rewrite (Apache HTTP Server)
- mod_headers (Apache HTTP Server)
- mod_ssl (Apache HTTP Server)
- Configuring HTTPS servers (nginx)
- Module ngx_http_ssl_module (nginx)
- Module ngx_http_rewrite_module (nginx)
- Module ngx_http_headers_module (nginx)
- Module ngx_http_core_module (nginx)
- HTTPS (WordPress advanced administration handbook)
- Improved HTTPS detection and migration in WordPress 5.7 (Make WordPress Core)
- Site Health screen (WordPress documentation)
- Settings General screen (WordPress documentation)
- Secure connections (Shopify Help Center)
- Using the rich text editor (Shopify Help Center)
- Troubleshooting your SSL certificate (Wix Help Center)
- Request: third-party SSL certificates (Wix Help Center)
- Understanding SSL certificates (Squarespace Help Center)
Start with a free scan of your site.
Two to five minutes, no account. You get your three most urgent findings, and the exact count of everything else.