Google Search Engine does not index Blogger/Blogspot blog due to ?m=1 - Solution using custom domain and Cloudflare proxy - SEO

Problem:

  • Google Search Engine (GSE) has multiple issues in indexing Google Blogger pages.
  • Especially the ?m=1 redirect on Blogspot cannot be actually solved by any solution I found on Internet, and this confused Google Search Engine with Mobile crawler (not Bing, LOL!)

What did NOT work for fixing ?m=1 redirect:

  • Add JavaScript to Redirect URLs Without the m=1 Suffix - this only change the URL for browser, the m=1 redirect is still there.
  • Use Canonical URL to Avoid Indexing the m=1 URL Version - this is already done; you can try to make the ?m=1 version as canonical, however Google does not like this either.
  • Under Mobile, set the option to “No. Show desktop theme on mobile devices” - that knob was removed from Blogspot
  • Setting Blogspot to serve the Desktop page for mobile - this only replaces the content, but it will still do the ?m=1 redirect for mobile crawlers (like Google)
  • using an older Blogspot Theme - the ?m=1 redirect is not in the theme anymore
  • using custom domain configured in Blogger - this makes the problem even worse, especially when using a subdomain (i.e philosophy.mihvoi.ro)


Solution

TLDR: to get rid of the ?m=1 indexing problem on Blogspot, the only solution I found is to use a personal domain and a reverse proxy worker at Cloudflare.

In order to not lose all traffic under the blogspot.com domain, we need to make a proxy that redirects requests from the new domain to the blogspot.com blog, rewriting the URLs to avoid the ?m=1 problem. The proxy can be made with a free account on cloudflare.com. It is easier than I expected.

Advantages:

- you can continue to write on Blogger, without migrating articles

- old links still gets traffic to the old blogspot domain

- new domain (with ?m=1 redirect fixed) gets indexed faster and gradually gains traffic

A more radical solution it to migrate(copy) all articles to a new hosting, however you cannot redirect the blogspot links to your new domain, and ir gets complex to keep articles in sync.


Now the full analysis of the ?m=1 issue

Analysis

Let's take as example this blogspot URL: https://meaningofstuff.blogspot.com/

  1. Blogspot uses an inconsistent redirect for mobile crawlers - the Google uses. You cannot see this on desktop, but you can see it on mobile: https://meaningofstuff.blogspot.com/ gets redirected to https://meaningofstuff.blogspot.com/?m=1 Nothing wrong functionally until here.
  2. However, the https://meaningofstuff.blogspot.com/?m=1 page contains a tag saying that the main page to be indexed is the one without "?m=1" <link href='https://meaningofstuff.blogspot.com/' rel='canonical'/>
  3. But Google can never index the page without "?m=1", because when using Mobile crawler it gets redirected to the page with "?m=1".
  4. The above creates a loop that often make Google to say "redirect error" and sometimes makes Blogspot to return 429 "Too Many Requests".

The only way to exit the loop is when Google uses the desktop crawler that does not get redirected. And desktop crawler is used more rarely lately by Google.


You can check the redirect on Linux with wget, using the Google crawler's name

wget '--user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Mobile/15E148 Safari/604.1' https://meaningofstuff.blogspot.com
--2026-09-29 20:38:50--  https://meaningofstuff.blogspot.com/
Resolving meaningofstuff.blogspot.com (meaningofstuff.blogspot.com)... 142.250.130.132, 2a00:1450:4025:804::84
Connecting to meaningofstuff.blogspot.com (meaningofstuff.blogspot.com)|142.250.130.132|:443... connected.
HTTP request sent, awaiting response... 302 Moved Temporarily
Location: https://meaningofstuff.blogspot.com/?m=1 [following]
--2026-09-29 20:38:50--  https://meaningofstuff.blogspot.com/?m=1
Reusing existing connection to meaningofstuff.blogspot.com:443.
HTTP request sent, awaiting response... 200 OK

Why custom domain configured on Blogger makes it even worse

- I tried to make philosophy.mihvoi.ro to be custom domain for meaningofstuff.blogspot.com

- What I didn't observed for months is this:

  • Blogger removed https://meaningofstuff.blogspot.com/robots.txt when I activated the custom domain to philosophy.mihvoi.ro
  • Old domain (meaningofstuff.blogspot.com) got slowly de-indexed by Google and other search engines dues to missing /robots.txt - existing SEO links are lost.
  • The new url, https://philosophy.mihvoi.ro/ has the same "?m=1" redirect, but even worse
  • It looks like Google has an workaround for blogspot.com domains that makes them indexable eventually
  • However, custom domains don't have this blogspot.com workaround and never get indexed
  • Someone says that if you use the full domain (like mihvoi.ro) as custom domain it might work better.


How to debug

First, start with indexing report on https://search.google.com/

What is highly unexpected, is that the chart for indexed pages is more than 1 week old. Check the date in the right bar!



So, even if you fix your indexing, you will not see progress here until a week passes.

The better way to check the indexing progress is to search on google using:

Above, you can observe is new pages got indexed or not, even before the Pages chart updates.

    Let's look at the "?m=1" page in URL Inspection:

    We see that the page was crawled, but the canonical URL is the url without "?m=1" page: https://meaningofstuff.blogspot.com/


We check the canonical URL: https://meaningofstuff.blogspot.com/, it was finally indexed, and the canonical URL of this page is equal with the URL of the page. Only those pages are indexed in Google, the rest counts only for links.




Now let's check the indexing progress

Go to Setting, By Purpose, check each of the two sections (Refresh and Discovery)



Always check exact date of crawling to be sure it was after your last change. Sometimes it takes more than 1 day to force index an URL.



In the example below, we see the 301 redirect for the canonical URL, then we have a Not found (404)


Then I checked the Robots report and found out that robots.txt could not be downloaded


Only after removing the custom domain, I could refresh the robots.txt and ask for pages to be re-indexed in URL Inspection



After a while, I could see that my page was correctly crawled, but still with the "?m=1" redirect

However, after some time, Google will use the Desktop crawler and will make that page indexed.

However, if you have a custom domain, old domains becomes invisible for indexing, and new domain (philosophy.mihvoi.ro) is even less likely to be indexed than the Blogspot domain (meaningofstuff.blogspot.com) that has the Google search workaround.

Note: even without custom domain, you can still inform Google about your new domain. Not sure how it helps, but it looks like something that can help.


Attention, if you set "Google Analytics Measurement ID", DO NOT also include the gtag javascript in your theme. This would duplicate the jtag and make Google to think you are trying to do something nasty. It took me >2 years to realize what happened: if you set this ID in settings, Blogspot will automatically include the javascript in your pages, no need to do it yourself in theme.



So, in order to solve the indexing redirect errors due to ?m=1

  • buy a custom domain, but do NOT set it in Blogger as custom domain - this would just make it worse; Example:


The Cloudflase worker that rewrites multiple subdomains looks like this (no warranties):
You need to add route in Cloudflare from your domain to the worker below:

Route: *.mihvoi.ro/*



export default {
  async fetch(request) {
    const url = new URL(request.url);

    // Upstream Blogspot domain
    const upstream = new URL(request.url);

 
    if ((url.hostname === "www.mihvoi.ro" || url.hostname === "mihvoi.ro") && url.protocol === "https:") {
      return fetch("http://www.mihvoi.ro/", request);
    }

    const originalHostname = url.hostname;
    if(originalHostname === "filosofie.mihvoi.ro"){
      upstream.hostname = "mihvoi.blogspot.com";
    }

    if(originalHostname === "philosophy.mihvoi.ro"){
      upstream.hostname = "meaningofstuff.blogspot.com";
    }

    if(originalHostname === "software.mihvoi.ro"){
      upstream.hostname = "software-meaning.blogspot.com";
    }

    let response = await fetch(upstream.toString(), {
      method: request.method,
      headers: request.headers,
      body: request.body
    });

    // Only rewrite HTML responses
    const contentType = response.headers.get("content-type") || "";
    if (!contentType.includes("text/html")
      && url.pathname !== "/robots.txt"
      && url.pathname !== "/sitemap.xml"
      && url.pathname !== "/sitemap-pages.xml"
    ) {
      return response;
    }

    let text = await response.text();

    text = text.replaceAll(upstream.hostname, originalHostname);
    text = text;

    return new Response(text, {
      headers: response.headers
    });
  }
};



I hope it helps, sorry for any writing mistakes.

Comments