- Odoo is built for websites that run multiple blogs, so it files every post inside its blog's folder:
/blog/<blog>/<post>. - The folder is your blog's name plus its ID. We named ours "Blog," Odoo gave it ID 1, so every post lived under
/blog/blog-1/. - With one blog, the folder adds nothing, and
/bloganswers with a temporary 302 redirect to/blog/blog-1. Same in Odoo 18, 19 and 20. - Our free module, for single-blog sites, serves posts at
/blog/your-post-30, moves RSS to/blog/feed, cleans upsitemap.xmland 301s every old URL. Code on GitHub.
Why the folder is there
Odoo lets one website run several blogs, say a company blog and a product updates blog. To keep them apart, each blog gets its own folder in the URL, and every post lives inside it: /blog/<blog>/<post>.
The folder name is your blog's name plus its record ID, which Odoo assigns. We named our blog "Blog," and it was the first one created, so the folder became blog-1. Name it "Insights" and you get insights-1.
Why that hurts a single blog
Most Odoo sites run exactly one blog. For them the folder is overhead: blog-1 sits in every post URL and tells a reader nothing.
/blog is worse. With only one blog to show, Odoo answers /blog with a 302 to /blog/blog-1. A 302 means "moved temporarily," so Google keeps treating /blog as the real page while the content lives somewhere else. Odoo's sitemap listed both, and Search Console flagged the redirecting one as "Page with redirect."
Odoo has noticed part of this. Starting in 19.1, the sitemap skips /blog on single-blog sites. The 302 and the folder are still there in Odoo 20.
Why a redirect rule doesn't fix it
The blog folder is hard-coded in the blog controller, the post URL field, half a dozen templates, the RSS route and the sitemap generator. A redirect in Website settings adds a hop, but every link Odoo renders still points at the old URL. Odoo also rewrites record URLs to their canonical form, so a hand-built /blog/<post> route bounces straight back to /blog/blog-1/.
What we built
A small Odoo 18 module, website_blog_flat_url, LGPL-3:
/blogrenders in place. 200, no redirect.- Posts live at
/blog/your-post-29. Tag and page URLs drop the folder too. - RSS moves to
/blog/feed. The old feed URL 301s there, and the feed keeps its ID, so subscribers keep their subscription and don't get every post again as new. sitemap.xmllists/blog,/blog/feedand every published post at its flat URL. No redirecting URLs, noblog-1.- Every old
/blog/blog-1/...URL 301s to its new home, so backlinks and indexed pages carry over. - Internal links (post lists, "read next," comment sign-in) point straight at the new URLs, with no extra hop.
This site runs it as of today. Check the URL of this page.
One blog or several?
This module is for websites with one blog. If you run several, keep Odoo's default: the folder is how Odoo tells your blogs apart. The module would fold every blog's index into a single /blog page, and /blog/feed only serves the first blog.
Running several blogs? Give each a meaningful name, so the folder reads /blog/news-2 instead of /blog/blog-1.
Install it
Copy the module into your addons path, update the Apps list and install it. It's a module, not an app, so clear the Apps filter when you search. Then delete the cached sitemap so Odoo rebuilds it, and resubmit it in Search Console. Odoo Online doesn't allow custom modules, so you need Odoo.sh or on-premise.
Code and full docs: github.com/19prince/Odoo-Blog-Flat-URLs. More free modules in the Lab.