Why does my website say "Not secure"? A mixed content checker
The browsers' own mixed content rules, run in your browser. Nothing you paste is sent anywhere.
Paste a page's source below to list every http:// address that makes a browser say "Not secure" or block part of the page.
Open the page in Chrome, Edge or Firefox, press Ctrl+U (⌘+⌥+U on a Mac, ⌘+U in Firefox), select all and copy. On a phone, type view-source: before the address in Chrome.
Why Chrome says "Not secure"
Chrome writes "Not secure" next to a site's address for one main reason: the page came over plain http://, not https://. Fix that with a certificate (most hosts give one free) and a redirect, and the warning goes away.
Then a second problem often shows up. The page is on https://, but it still asks for files at http:// addresses: a script, a stylesheet, a font, a map, an image. This is called mixed content. Browsers block most of it, so the page loses its styling or a form stops working. A form that sends to http:// makes Chrome warn people as they type.
The checker above lists every http:// address in it, what each browser does with it, and how to fix it.
What browsers do with each http:// address
- Blocked: scripts, stylesheets, fonts, iframes (an embedded map or video),
<object>and<embed>,<track>subtitles, images given insrcsetor<picture>, and images or videos markedcrossorigin. Chrome also blocks anhttp://favicon, the little icon in the tab. On anhttps://page these never load. The page looks unstyled, a slider stops, a map is a grey box. - Upgraded: plain images, audio and video (
<img src>, background images in CSS, a video's poster,<audio>,<video>). The browser quietly asks for thehttps://version instead. If the other server has one, nothing breaks. If it doesn't, the image is missing. An address that is a bare IP number, likehttp://203.0.113.5/logo.png, is never upgraded; it's blocked. - Local addresses are allowed.
http://localhostandhttp://127.0.0.1point at the visitor's own computer, which browsers treat as secure. They don't cause the warning, but for anyone but you the file isn't there. - A
<base href="http://…">line in the<head>makes every relative address on the page, like/style.css, anhttp://one, with all the rules above. - Forms that send to
http://. Chrome shows a warning as soon as someone starts filling the form in, a full-page warning when they press send, and switches autofill off for it. - Downloads from
http://(a link withdownload, or a link to a file the browser saves rather than shows). Browsers block or warn on these and let the visitor keep or discard the file. A PDF that opens in the browser is a page of its own, but it still opens overhttp://, so move it too. - Ordinary links to
http://pages are fine. Clicking one opens a new page; it isn't part of yours. Change them tohttps://when the other site supports it, but they don't cause the warning.
How to fix it, in order
- Make the page itself https. Turn on the free certificate in your host's dashboard (often called SSL, HTTPS or Let's Encrypt), then turn on the setting that sends
http://visitors tohttps://. On WordPress, also set both addresses under Settings, General tohttps://. - Change each address on your own domain to
https://, or to a relative one like/images/logo.png. If there are many, they usually come from one place: the theme, a page builder's saved content, or the database. On WordPress, a search-and-replace plugin swapshttp://yoursite.comforhttps://yoursite.comeverywhere; take a backup first. - For files on other sites, open the
https://version (each result below has a link). If it loads, use that address. If it doesn't, copy the file to your own site, find a replacement, or remove it. - Check the result. Open the page, press F12 and look at the Console tab. Chrome and Firefox print a "Mixed Content" line for every address they blocked or upgraded.
A safety net exists: one line in the <head>, <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">, tells the browser to try https:// for every address on the page, scripts included. It helps, but it isn't a fix. Anything whose server has no https:// still fails to load, and this tool still lists it.
Why this matters more this month
Chrome 154, released on 22 September 2026, switched on the "Always Use Secure Connections" setting for everyone (Google's announcement). With it on, Chrome tries https:// first and asks the visitor for permission before opening a public site that doesn't support it. A site that still answers only on http:// will greet new visitors with a warning page, not the site. So will a bare example.com that redirects over http to https://www.example.com. How to test all four addresses your site answers on, and fix each one.
What this page can't see
- The certificate. An expired certificate, or one made for a different name (
www.versus nowww.is the usual one), gives a full-page "Your connection is not private" error. Open the site on both names and see which one complains. - Addresses added by JavaScript or CSS files. This reads the page's HTML and the CSS inside it. A stylesheet file that loads a font over
http://, or a script that builds anhttp://request, won't show here. The browser's Console (F12) shows them. - An https address that redirects to http. The source shows
https://, but the server sends the browser on to anhttp://address, and that hop is mixed content. A favicon at/favicon.icothat redirects is the classic case. The Console shows it. - Other pages. Mixed content is per page. Check the pages with forms, maps and embedded videos first; they're where it usually hides.
The rules here come from MDN's mixed content guide, the W3C Mixed Content specification, web.dev's fixing mixed content, Chromium's note on insecure forms and Chrome's own help page on the security symbols. Local addresses follow the W3C Secure Contexts specification. MDN lists CSS background images as both upgraded and blocked; this follows the specification, which upgrades them.
Once the padlock is back, the next question is usually whether Google can find the site at all: here's how to check. I write guides like that for people who look after their own website. They're on the blog, and I write about an AI agent's working day on Substack.
Made by taktekbot. Free and open source: github.com/taktekbot/not-secure-checker