Don't let Google not find your article
The SSR Blog's SEO Troubleshooting Fact Sheet
During the process of building a blog with Astro + PostgreSQL, the reasons behind every SEO decision—and the pitfalls that almost made
Why is SEO for SSR Blog different from static sites?#
Dynamic Content is not available on Sitemap#
The SSR page is generated by runtime.@astrojs/sitemap Only the build-time static page is included.
Article posted but not in sitemap = Google doesn't even know it exists.
Tool Schema is not the only stealth formatter.#
Like MCP tokens, SEO also has "hidden costs": missing meta tags, hreflang errors, canonical inconsistencies.
67% Multi-language station hreflang implementation error.
SSR's Double Edge of Performance#
SSR allows content to be updated in real time, but also makes TTFB subject to DB query times.
No caching strategy = run DB query on every request.
Composition of this Blog#
What have we done?#
Each layer deals with an SEO orientation, with clear consumers from top to bottom.
sitemap-posts.xml Query published articles from DB, automatically patch them in when building.sitemap-index.xmlhttp://localhost cap (a poem)https://blog.joneshong.com Convicted of duplication/admin/ cap (a poem)/api/The Points to two sitemapCore Web Vitals Optimization#
Astro's ultimate weapon:By default, no JavaScript is sent. React components only hydrate where they need to interact (client:onlyThe rest is static HTML.
How did we find out?#
It's not about pre-designing the SEO and then implementing it - it's about stepping into each hole and realizing it.
sitemap-posts.xml No one's quoting.#
@astrojs/sitemap generatingsitemap-index.xml This page contains only static pages. Dynamicsitemap-posts.xml Ignored. Fixed: automatically patch sitemap-index to add posts sitemap after build.
Leadership:The automation tool may not cover all cases, and the SSR dynamics page needs to be filled manually.
Rich HTMLcontent.length Includes the entire CSS#
content.length / 400 Counts the reading time, but Rich HTML formatted content has 25000+ words of CSS + HTML tags. strip tags are correct.
Leadership:Any logic related to the length of the content should be preceded by "what format is this content in".
Vite dev server + subpath = dead path#
Vite's ES module import uses absolute path, nginxsub_filter I can't finish it. Solution: dev preview doesn't use Vite dev server, use built SSR server instead.
Leadership:Astro islandscomponent-url Attributes need to be rewritten by sub_filter as well.
Copy to your AI Agent#
Paste the following paragraph to your AI coding agent so that it can help you evaluate the SEO settings of your SSR Blog.
Extended Reading#
These are the resources that have actually been referred to and borrowed in the process.
| writings | Why is it important? |
|---|---|
| Apideck: Your MCP Server Is Eating Your Context Window | Inspired by the analogy of "invisible forms of origin" |
| SEO for Astro: How to Make the Fastest Framework Also the Smartest | The Complete Guide to Astro SEO Implementation |
| JSON-LD Blog Post Example | BlogPosting schema reference implementation |
| Multilingual SEO and Hreflang Guide | 67% Source of error rate data |
| How to Improve Core Web Vitals | Specific methods for optimizing SSR performance |
SEO is engineering, not metaphysics#
There is a reason for every decision and a lesson to be learned from every pitfall.
SEO for SSR Blogs isn't a matter of setting up meta tags and calling it a day - it's an ongoing, iterative engineering problem.
Question 1: Dynamic articles not in sitemap
→Manual Compensationsitemap-posts.xml
Question 2: SSR No Cache
→ Static Pageprerender + Dynamic PageSSR
Question 3: Multilingual SEO Error-prone
→hreflang Bidirectional +x-default
Verification: Google Search Console Manual Submission + Monitoring
// Summarize
Astro SSR + Automated SEO pipeline
No missing records, no duplication, no delays.
Recommended
tmux from generic status bar, split screen, remote to multi-agent division of labor
February 2026 was inspired by openclaw to start using tmux, from status bar, split screen, remote development all the way to stacking to multi-agent division of labor.
memvault panorama: three tracks × three levels of mindfulness
The memvault trilogy omnibus - writing, organizing, and recalling into one map, complementing the CLT cognitive load, 4 Event Flows, and RxJS Reactive triple cross-track mindset.
When I think about it - how AI Agent understands me better and better.
Cross-session memory extraction, from "can save" to "can call back". Three contexts, one pipeline, and 11 layers of sorting.