Skip to content

feat(seo): technical SEO fixes (hreflang dedup, Plugin Hub, structured data, blog H1, Netlify noindex)#2054

Merged
Yilialinn merged 6 commits into
masterfrom
feat/seo-technical-fixes
Jun 23, 2026
Merged

feat(seo): technical SEO fixes (hreflang dedup, Plugin Hub, structured data, blog H1, Netlify noindex)#2054
Yilialinn merged 6 commits into
masterfrom
feat/seo-technical-fixes

Conversation

@moonming

@moonming moonming commented Jun 22, 2026

Copy link
Copy Markdown
Member

Summary

A batch of low-risk, high-value technical SEO fixes for apisix.apache.org. Each is an independent commit.

  • Remove redundant hreflang plugin — Docusaurus already emits <link rel="canonical"> and hreflang alternate links natively (react-helmet) on every page. config/hreflang.js (loaded only by the website/ instance) re-added a second, duplicate plain set, so every website/ page shipped two sets of hreflang tags. Removing it leaves a single source of truth. Verified: the doc/ and blog/ instances never loaded the plugin and already render exactly one correct set.
  • Plugin Hub (/plugins/) — title Plugin HubPlugin Hub: 100+ API Gateway & AI Plugins; corrected the stale "80+" count to "100+" (actual built count: 105); added CollectionPage + ItemList (enumerates every plugin) and FAQPage JSON-LD. ItemList URLs use the canonical trailing-slash form.
  • Homepage — added SoftwareApplication + FAQPage JSON-LD. Organization/WebSite are already injected globally by config/schema-org.js.
  • Blog index (/blog/) — added a visible <h1>; the default Docusaurus blog list ships without one.
  • Netlify mirrornetlify.toml sets X-Robots-Tag: noindex. Production (apisix.apache.org) is served by Apache httpd + Fastly and does not read this file; apache-apisix.netlify.app is a mirror that should not compete with the canonical site in search. Note: this also de-indexes the archived doc versions hosted on that mirror (config/apisix-versions.jsarchivedVersions), which is intended.

Note on the structured data

The JSON-LD is added primarily for entity understanding and AI-answer eligibility, not guaranteed rich snippets:

  • FAQPage is valid markup, but Google no longer renders FAQ rich results for non-government/health sites (policy change, 2023). It still helps AI/other engines.
  • SoftwareApplication is valid, but a SoftwareApplication rich result also requires aggregateRating or review, which are intentionally not included (no rating data to cite — we won't fabricate one).

Test plan

  • CI build passes (multi-instance Docusaurus build).
  • /plugins/ <title> shows the new text; page source contains valid CollectionPage / ItemList / FAQPage JSON-LD (passes Rich Results Test validation; ItemList URLs are 200, not redirects).
  • Homepage source contains valid SoftwareApplication + FAQPage JSON-LD.
  • /blog/ renders exactly one <h1>.
  • Every website/ page emits exactly one set of hreflang + canonical tags (no duplicates) — e.g. /, /plugins/, /learning-center/apisix-vs-kong/.
  • apache-apisix.netlify.app responses include X-Robots-Tag: noindex.

Verification done

Config syntax checked; Plugin Hub JSON-LD generated against the real plugins.json (105 plugins, valid); single-source canonical/hreflang confirmed on the live doc/+blog/ instances; an independent review confirmed no other config requires the removed plugin and the ItemList URL logic matches the on-page card logic. Full multi-instance build verification is delegated to CI.

moonming added 6 commits June 22, 2026 11:34
Docusaurus already emits canonical and hreflang alternate links natively
(via react-helmet) on every page. The custom postBuild plugin in
config/hreflang.js (loaded only by the website/ instance) merely re-added a
second, duplicate set of hreflang tags. Remove it to keep one source of truth.
- Title: 'Plugin Hub' -> 'Plugin Hub: 100+ API Gateway & AI Plugins'
- Fix stale plugin count in description (80+ -> 100+; actual is 105)
- Add CollectionPage + ItemList JSON-LD enumerating all plugins
- Add FAQPage JSON-LD for rich results / AI answers
The default Docusaurus blog index renders no H1, an on-page SEO gap.
Production (apisix.apache.org) is served by Apache infra + Fastly and does not
read netlify.toml. apache-apisix.netlify.app is a mirror that should not
compete with production in search results; add X-Robots-Tag: noindex.
doc/ uses trailingSlash: true, so the slash-less URLs each 301-redirect.
Structured-data URLs should name the canonical 200 target directly.
@Yilialinn Yilialinn merged commit 5ab6563 into master Jun 23, 2026
1 check passed
@Yilialinn Yilialinn deleted the feat/seo-technical-fixes branch June 23, 2026 02:53
@Yilialinn Yilialinn restored the feat/seo-technical-fixes branch June 23, 2026 02:55
@Yilialinn Yilialinn deleted the feat/seo-technical-fixes branch June 23, 2026 03:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants