Page reached over HTTP before redirecting to HTTPS
What is this issue?
This check reports a page that was requested over HTTP and reached its final HTTPS address only after a redirect.
The redirect itself is correct. A site should send http:// to https://, and
one that did not would be reported by a different, more serious check. What this
finding says is that the insecure address is still being reached: something --
an internal link, a sitemap entry, a hard-coded URL in a template -- is still
publishing the http:// spelling.
The judgement is made on the first hop, because that is the address something linked to and the only one you can change. A chain that starts on HTTPS and drops to plaintext part-way through is a different and worse fault, and is not what this reports.
For a URL to pass this check:
- It was requested at its
https://address directly, with no HTTP hop first.
Why it matters
Everything ends up in the right place, which is why this is graded standard rather than higher. The costs are small and entirely avoidable:
- A plaintext round trip. The first request, including the full URL and any
cookies not marked
Secure, crosses the network unencrypted before the upgrade happens. That request is interceptable and modifiable. - A wasted hop. Every visit pays an extra round trip, which is most noticeable on a slow mobile connection.
- Diluted signals. External links to the
http://form pass their value through a redirect rather than directly. - Crawl budget. Search engines fetch both addresses.
- It hides the source. Each instance points at something in your own site or sitemap that still hard-codes the old scheme.
Fixing it is a search-and-replace plus, ideally, an HSTS header so browsers stop making the insecure request at all.
How to fix it
Find what links to the HTTP address. The finding names the address that was requested; search your templates, content and configuration for it.
Update internal links to HTTPS, or make them relative so they inherit the page's scheme automatically.
Check the XML sitemap. A sitemap that lists
http://URLs is telling every search engine to request the insecure form of every page.Send an HSTS header.
Strict-Transport-Securitytells browsers to make the request over HTTPS from the start, so the plaintext round trip stops happening even when an old link is followed. This is a separate check in PixyScan (Delivery and Trust).Keep the redirect. Do not remove the
http://tohttps://rule; the addresses already published elsewhere still need it.Update canonical tags, hreflang and structured data if any of them still name the
http://form.
Examples
Example 1: Linked directly to HTTPS
Scenario: An internal link written with the secure scheme.
Passes because: no redirect was needed.
GET https://example.com/pricing -> 200Example 2: An internal link still on HTTP
Scenario: A footer template that hard-codes the old address.
Fails because: the request started in plaintext, and the upgrade cost a redirect.
GET http://example.com/pricing -> 301 -> https://example.com/pricing
GET https://example.com/pricing -> 200Corrected version: change the footer link to the HTTPS address (or make it relative), keep the redirect for the links you do not control, and send an HSTS header.
Example 3: A chain that stays on HTTP
Scenario: A site that has not migrated.
Not reported here because: the chain never reaches HTTPS. That is a page not served over HTTPS, which is a separate and more serious finding.
GET http://example.com/page -> 301 -> http://example.com/page/
GET http://example.com/page/ -> 200How PixyScan detects this
Records the redirect chain for each page, hop by hop, in the order it was travelled.
Looks at the first hop that has a URL. That is the address the request actually started from -- the one something linked to.
Reports when that first hop is
http://and the chain resolved tohttps://. The scheme comparison ignores case.Does not report a chain that ends on HTTP. That is a page not served over HTTPS at all, which has its own check and a different fix.
Does not report an HTTP hop in the MIDDLE of an otherwise HTTPS chain. The page was reached securely, so "reached over HTTP" would be untrue of it, and the reader would be sent looking for an
http://link that does not exist.Lists every insecure hop it saw, so a chain that touches plaintext more than once shows all of them.
What we store
Storage Level
Page Level
Database Table / Prisma Model
audit_issues.details
Stored Fields
| Field | Type | Description |
|---|---|---|
| originalUrl | String | The http:// address that was requested |
| finalUrl | String | The https:// address the chain resolved to |
| insecureHops | String[] | Every http:// hop in the chain |
Detection Dependencies
- HTTP Response
- Redirect Chain
Note
The chain is also stored on the RedirectChain row for this scan. The finding
keeps the insecure hops separately so the row names the address that needs
changing without re-reading the chain.