This is an automated email from the ASF dual-hosted git repository.

wenming pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix-website.git


The following commit(s) were added to refs/heads/master by this push:
     new a5c1b161b5e fix: improve SEO across the website (#2002)
a5c1b161b5e is described below

commit a5c1b161b5eaf5451e06ae90b2600a1b0d33a9f9
Author: Ming Wen <[email protected]>
AuthorDate: Thu Mar 12 16:31:09 2026 +0800

    fix: improve SEO across the website (#2002)
---
 .htaccess                                      |  8 ++++----
 blog/en/docusaurus.config.js                   |  6 +++---
 blog/zh/docusaurus.config.js                   |  6 +++---
 config/schema-org.js                           | 26 ++++++++++++++++++++------
 doc/docusaurus.config.js                       |  6 +++---
 website/docusaurus.config.js                   |  6 +++---
 website/src/components/AIGateway/Advantage.tsx |  2 +-
 website/src/components/AIGateway/Hero.tsx      |  2 +-
 website/src/pages/docs.tsx                     |  5 +++++
 website/src/pages/downloads.tsx                |  5 +++++
 website/src/pages/help.tsx                     |  5 +++++
 website/src/pages/plugins.tsx                  |  2 ++
 website/src/pages/showcase.tsx                 |  5 +++++
 website/src/pages/team.tsx                     |  5 +++++
 website/static/robots.txt                      |  8 +++++++-
 15 files changed, 72 insertions(+), 25 deletions(-)

diff --git a/.htaccess b/.htaccess
index 3406c6641fa..28414e2465d 100644
--- a/.htaccess
+++ b/.htaccess
@@ -41,10 +41,10 @@ Redirect 302 "/slack" 
"https://join.slack.com/t/the-asf/shared_invite/zt-1ugrg37
 Redirect 302 "/community-meeting-signup" 
"https://docs.google.com/forms/d/1C9bIJ3eh0bQrBdv4rPGxHDUvX4giNQ_IRCmDDOQ2mgE/";
 Redirect 302 "/contributor-workshop-signup" 
"https://docs.google.com/forms/d/1LUER3R9-aFsUm7MhjVd_CM1xAGnkuWIe62prFH5aqAE/";
 Redirect 302 "/guest-blog-post" "https://forms.gle/unQpSm7FyqkfaSSP8/";
-RedirectMatch 302 "^/docs/apisix/getting-started/$" 
"/docs/apisix/getting-started/README/"
-RedirectMatch 302 "^/zh/docs/apisix/getting-started/$" 
"/zh/docs/apisix/getting-started/README/"
-RedirectMatch 302 "^/docs/apisix/3\.2/plugins/(.*)$" 
"https://apache-apisix.netlify.app/docs/apisix/3.2/plugins/$1";
-RedirectMatch 302 "^/zh/docs/apisix/3\.2/plugins/(.*)$" 
"https://apache-apisix.netlify.app/zh/docs/apisix/3.2/plugins/$1";
+RedirectMatch 301 "^/docs/apisix/getting-started/$" 
"/docs/apisix/getting-started/README/"
+RedirectMatch 301 "^/zh/docs/apisix/getting-started/$" 
"/zh/docs/apisix/getting-started/README/"
+RedirectMatch 301 "^/docs/apisix/3\.2/plugins/(.*)$" 
"https://apache-apisix.netlify.app/docs/apisix/3.2/plugins/$1";
+RedirectMatch 301 "^/zh/docs/apisix/3\.2/plugins/(.*)$" 
"https://apache-apisix.netlify.app/zh/docs/apisix/3.2/plugins/$1";
 
 Redirect 301 "/docs/apisix/install" "/docs/apisix/how-to-build/"
 Redirect 301 "/docs/apisix/architecture-design/plugin/" 
"/docs/apisix/architecture-design/plugin-config/"
diff --git a/blog/en/docusaurus.config.js b/blog/en/docusaurus.config.js
index db4bcf7a55b..d41cc9287a1 100644
--- a/blog/en/docusaurus.config.js
+++ b/blog/en/docusaurus.config.js
@@ -17,7 +17,7 @@ const metadatas = [
   },
   {
     name: 'twitter:card',
-    content: 'summary',
+    content: 'summary_large_image',
   },
 ];
 
@@ -31,8 +31,8 @@ module.exports = {
   organizationName: 'Apache',
   projectName: 'apisix-website',
   favicon: 'https://static.apiseven.com/202202/favicon.png',
-  onBrokenLinks: 'ignore',
-  onBrokenMarkdownLinks: 'ignore',
+  onBrokenLinks: 'log',
+  onBrokenMarkdownLinks: 'warn',
   noIndex: false,
   i18n: {
     defaultLocale: 'en',
diff --git a/blog/zh/docusaurus.config.js b/blog/zh/docusaurus.config.js
index 2c3eb5a2e29..6d3ef1b9916 100644
--- a/blog/zh/docusaurus.config.js
+++ b/blog/zh/docusaurus.config.js
@@ -18,7 +18,7 @@ const metadatas = [
   },
   {
     name: 'twitter:card',
-    content: 'summary',
+    content: 'summary_large_image',
   },
 ];
 
@@ -32,8 +32,8 @@ module.exports = {
   organizationName: 'Apache',
   projectName: 'apisix-website',
   favicon: 'https://static.apiseven.com/202202/favicon.png',
-  onBrokenLinks: 'ignore',
-  onBrokenMarkdownLinks: 'ignore',
+  onBrokenLinks: 'log',
+  onBrokenMarkdownLinks: 'warn',
   noIndex: false,
   i18n: {
     defaultLocale: 'zh',
diff --git a/config/schema-org.js b/config/schema-org.js
index 560c654e3d9..5903b5224c3 100644
--- a/config/schema-org.js
+++ b/config/schema-org.js
@@ -9,12 +9,26 @@ module.exports = function () {
             attributes: {
               type: 'application/ld+json',
             },
-            innerHTML: JSON.stringify({
-              '@context': 'https://schema.org',
-              '@type': 'WebSite',
-              name: 'Apache APISIX',
-              url: 'https://apisix.apache.org',
-            }),
+            innerHTML: JSON.stringify([
+              {
+                '@context': 'https://schema.org',
+                '@type': 'WebSite',
+                name: 'Apache APISIX',
+                url: 'https://apisix.apache.org',
+              },
+              {
+                '@context': 'https://schema.org',
+                '@type': 'Organization',
+                name: 'Apache APISIX',
+                url: 'https://apisix.apache.org',
+                logo: 'https://apisix.apache.org/img/logo2.svg',
+                sameAs: [
+                  'https://github.com/apache/apisix',
+                  'https://twitter.com/ApacheAPISIX',
+                  'https://www.youtube.com/channel/UCgPD18cMhOg5rmPVnQhAC8g',
+                ],
+              },
+            ]),
           },
         ],
       };
diff --git a/doc/docusaurus.config.js b/doc/docusaurus.config.js
index a8675f90565..18727090b52 100644
--- a/doc/docusaurus.config.js
+++ b/doc/docusaurus.config.js
@@ -55,8 +55,8 @@ module.exports = {
       },
     },
   },
-  onBrokenLinks: 'ignore',
-  onBrokenMarkdownLinks: 'ignore',
+  onBrokenLinks: 'log',
+  onBrokenMarkdownLinks: 'warn',
   noIndex: false,
   presets: [
     [
@@ -252,7 +252,7 @@ module.exports = {
       },
       {
         name: 'twitter:card',
-        content: 'summary',
+        content: 'summary_large_image',
       },
     ],
   },
diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js
index fedf9a5e3b8..d7b5cb3b39c 100644
--- a/website/docusaurus.config.js
+++ b/website/docusaurus.config.js
@@ -50,8 +50,8 @@ module.exports = {
       },
     },
   },
-  onBrokenLinks: 'ignore',
-  onBrokenMarkdownLinks: 'ignore',
+  onBrokenLinks: 'log',
+  onBrokenMarkdownLinks: 'warn',
   noIndex: false,
   presets: [
     [
@@ -143,7 +143,7 @@ module.exports = {
       },
       {
         name: 'twitter:card',
-        content: 'summary',
+        content: 'summary_large_image',
       },
     ],
   },
diff --git a/website/src/components/AIGateway/Advantage.tsx 
b/website/src/components/AIGateway/Advantage.tsx
index 396d0ea0d4d..feae57d221b 100644
--- a/website/src/components/AIGateway/Advantage.tsx
+++ b/website/src/components/AIGateway/Advantage.tsx
@@ -156,7 +156,7 @@ const Advantage: React.FC = () => {
                   </Text>
                   <AvifImage
                     src={item.picture}
-                    alt=""
+                    alt="AI plugin icons for LLMs load balancing and token 
rate limiting"
                     height="50px"
                     w="full"
                     objectFit="contain"
diff --git a/website/src/components/AIGateway/Hero.tsx 
b/website/src/components/AIGateway/Hero.tsx
index 5115502cc81..2da332e8cdd 100644
--- a/website/src/components/AIGateway/Hero.tsx
+++ b/website/src/components/AIGateway/Hero.tsx
@@ -62,7 +62,7 @@ const Hero: React.FC = () => {
             <Box w="full">
               <AvifImage
                 
src="https://static.api7.ai/uploads/2025/04/17/zdPVQ1zg_apisix-ai-gateway.png";
-                alt=""
+                alt="Apache APISIX AI Gateway architecture overview"
                 animation={fadeInAnimation}
                 w="full"
                 transform="scale(1.1)"
diff --git a/website/src/pages/docs.tsx b/website/src/pages/docs.tsx
index ea89ccca950..db08cd83ea9 100644
--- a/website/src/pages/docs.tsx
+++ b/website/src/pages/docs.tsx
@@ -2,6 +2,7 @@ import type { FC } from 'react';
 import React from 'react';
 import styled from 'styled-components';
 import Layout from '@theme/Layout';
+import Head from '@docusaurus/Head';
 import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
 
 import Translate, { translate } from '@docusaurus/Translate';
@@ -177,6 +178,10 @@ const Docs: FC = () => {
 
   return (
     <Layout title={translate({ message: 'Documentation' })}>
+      <Head>
+        <meta name="description" content={translate({ id: 
'docs.meta.description', message: 'Browse Apache APISIX documentation for API 
Gateway, AI Gateway, Ingress Controller, Helm Chart, and plugin development. 
Get started with guides, tutorials, and API references.' })} />
+        <meta property="og:description" content={translate({ id: 
'docs.meta.ogDescription', message: 'Browse Apache APISIX documentation for API 
Gateway, AI Gateway, Ingress Controller, Helm Chart, and plugin development.' 
})} />
+      </Head>
       <Page>
         <PageTitle>
           <Translate id="docs.webpage.title.Document">Documentation</Translate>
diff --git a/website/src/pages/downloads.tsx b/website/src/pages/downloads.tsx
index bd673e4e808..0ae16685f81 100644
--- a/website/src/pages/downloads.tsx
+++ b/website/src/pages/downloads.tsx
@@ -2,6 +2,7 @@ import type { FC } from 'react';
 import React from 'react';
 import styled from 'styled-components';
 import Layout from '@theme/Layout';
+import Head from '@docusaurus/Head';
 import CodeBlock from '@theme/CodeBlock';
 
 import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
@@ -57,6 +58,10 @@ const DownloadCards: FC = () => {
 
 const Downloads: FC = () => (
   <Layout title={translate({ message: 'Downloads' })}>
+    <Head>
+      <meta name="description" content={translate({ id: 
'download.meta.description', message: 'Download Apache APISIX, the cloud-native 
API Gateway and AI Gateway. Get the latest release, verify signatures, and 
access historical versions.' })} />
+      <meta property="og:description" content={translate({ id: 
'download.meta.ogDescription', message: 'Download Apache APISIX, the 
cloud-native API Gateway and AI Gateway. Get the latest release and historical 
versions.' })} />
+    </Head>
     <DownloadsPage>
       <PageTitle><Translate 
id="download.website.title">Downloads</Translate></PageTitle>
       <PageSubtitle><Translate id="download.website.subtitle">We love open 
source.</Translate></PageSubtitle>
diff --git a/website/src/pages/help.tsx b/website/src/pages/help.tsx
index 43845aa4324..4835dace0b4 100644
--- a/website/src/pages/help.tsx
+++ b/website/src/pages/help.tsx
@@ -2,6 +2,7 @@ import type { FC } from 'react';
 import React from 'react';
 import styled from 'styled-components';
 import Layout from '@theme/Layout';
+import Head from '@docusaurus/Head';
 
 import Translate, { translate } from '@docusaurus/Translate';
 
@@ -28,6 +29,10 @@ const Page = styled.div`
 
 const Help: FC = () => (
   <Layout title={translate({ message: 'Help' })}>
+    <Head>
+      <meta name="description" content={translate({ id: 
'help.meta.description', message: 'Get help with Apache APISIX. Browse 
documentation, join the community on GitHub, Slack, and Twitter, and connect 
with contributors.' })} />
+      <meta property="og:description" content={translate({ id: 
'help.meta.ogDescription', message: 'Get help with Apache APISIX. Browse 
documentation and join the community on GitHub, Slack, and Twitter.' })} />
+    </Head>
     <Page className="help-page">
       <PageTitle><Translate id="help.website.title">NEED 
HELP?</Translate></PageTitle>
       <PageSubtitle>
diff --git a/website/src/pages/plugins.tsx b/website/src/pages/plugins.tsx
index e31c7719fbe..0b64fc95805 100644
--- a/website/src/pages/plugins.tsx
+++ b/website/src/pages/plugins.tsx
@@ -236,6 +236,8 @@ const Plugins: FC = () => {
   return (
     <Layout title={translate({ message: 'Plugin Hub' })}>
       <Head>
+        <meta name="description" content={translate({ id: 
'plugins.meta.description', message: 'Explore 80+ Apache APISIX plugins for 
authentication, security, traffic control, observability, and AI. Powerful 
integrations for your API Gateway.' })} />
+        <meta property="og:description" content={translate({ id: 
'plugins.meta.ogDescription', message: 'Explore 80+ Apache APISIX plugins for 
authentication, security, traffic control, observability, and AI.' })} />
         <script src="/js/plugin-icon.js" defer />
       </Head>
       <Page>
diff --git a/website/src/pages/showcase.tsx b/website/src/pages/showcase.tsx
index bbe0c995b5d..962142c04cf 100644
--- a/website/src/pages/showcase.tsx
+++ b/website/src/pages/showcase.tsx
@@ -4,6 +4,7 @@ import useDocusaurusContext from 
'@docusaurus/useDocusaurusContext';
 import Translate, { translate } from '@docusaurus/Translate';
 
 import Layout from '@theme/Layout';
+import Head from '@docusaurus/Head';
 import '../css/showcase.scss';
 
 const Container: FC = (props) => {
@@ -80,6 +81,10 @@ const Content: FC = () => {
 
 const Showcase: FC = () => (
   <Layout title={translate({ message: 'ShowCase' })}>
+    <Head>
+      <meta name="description" content={translate({ id: 
'showcase.meta.description', message: 'See which companies and organizations 
use Apache APISIX in production. Join the growing community of API Gateway 
users worldwide.' })} />
+      <meta property="og:description" content={translate({ id: 
'showcase.meta.ogDescription', message: 'See which companies and organizations 
use Apache APISIX in production.' })} />
+    </Head>
     <Container>
       <Header />
       <Content />
diff --git a/website/src/pages/team.tsx b/website/src/pages/team.tsx
index 99b6492e730..0ec75721582 100644
--- a/website/src/pages/team.tsx
+++ b/website/src/pages/team.tsx
@@ -2,6 +2,7 @@ import type { FC } from 'react';
 import React from 'react';
 import styled from 'styled-components';
 import Layout from '@theme/Layout';
+import Head from '@docusaurus/Head';
 import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
 
 import Translate, { translate } from '@docusaurus/Translate';
@@ -287,6 +288,10 @@ const Team: FC = () => {
   ));
   return (
     <Layout title={translate({ message: 'Team' })}>
+      <Head>
+        <meta name="description" content={translate({ id: 
'team.meta.description', message: 'Meet the Apache APISIX team — PMC members, 
committers, and contributors building the cloud-native API Gateway and AI 
Gateway.' })} />
+        <meta property="og:description" content={translate({ id: 
'team.meta.ogDescription', message: 'Meet the Apache APISIX team — PMC members, 
committers, and contributors.' })} />
+      </Head>
       <Page>
         <PageTitle><Translate 
id="team.webpage.title.Team">Team</Translate></PageTitle>
         <PageSubtitle><Translate id="team.webpage.title.DocumentSubtitle">We 
love open source.</Translate></PageSubtitle>
diff --git a/website/static/robots.txt b/website/static/robots.txt
index 532114335d4..ae9f8c504fb 100644
--- a/website/static/robots.txt
+++ b/website/static/robots.txt
@@ -1,7 +1,13 @@
 # Algolia-Crawler-Verif: 027907D9E46C48C1
 
 User-agent: *
+Disallow: /blog/tags/
+Disallow: /zh/blog/tags/
+Disallow: /blog/page/
+Disallow: /zh/blog/page/
+Disallow: /search
+Disallow: /zh/search
 
 Sitemap: https://apisix.apache.org/sitemap.xml
 
-Sitemap: https://apisix.apache.org/zh/sitemap.xml
\ No newline at end of file
+Sitemap: https://apisix.apache.org/zh/sitemap.xml

Reply via email to