SEO 全链路:OG/Twitter 标签 + robots.txt + sitemap.xml + JSON-LD 结构化数据

- layout metadata: Open Graph + Twitter Card + canonical + robots 指令
- app/robots.ts: 允许首页/auth,禁止 /terminal/account/ops/api
- app/sitemap.ts: 首页 1.0 + /auth/login 0.6
- 首页 JSON-LD: WebApplication schema,含 $10/mo 定价
This commit is contained in:
2569718930@qq.com
2026-05-26 08:43:55 +08:00
parent c88d313f60
commit 09a8e1bfbe
4 changed files with 94 additions and 2 deletions
+39 -2
View File
@@ -18,10 +18,47 @@ const jetbrainsMono = JetBrains_Mono({
});
export const metadata: Metadata = {
title: "PolyWeather | Weather Intelligence",
title: {
default: "PolyWeather | Institutional Weather Signal Intelligence",
template: "%s | PolyWeather",
},
description:
"PolyWeather paid professional terminal for weather-signal intelligence, city decision cards, and subscription-only analytics.",
"PolyWeather is a paid professional weather-signal intelligence terminal with METAR evidence, DEB forecast blending, and AI decision cards. Real-time observations for 51 global cities.",
manifest: "/site.webmanifest",
metadataBase: new URL("https://polyweather.top"),
alternates: {
canonical: "/",
},
openGraph: {
type: "website",
siteName: "PolyWeather",
title: "PolyWeather | Institutional Weather Signal Intelligence",
description:
"Paid professional weather-signal intelligence terminal. METAR evidence, DEB forecast blending, AI decision cards. 51 cities, real-time.",
url: "https://polyweather.top",
images: [
{
url: "/apple-touch-icon.png",
width: 180,
height: 180,
alt: "PolyWeather",
},
],
},
twitter: {
card: "summary",
title: "PolyWeather | Weather Signal Intelligence",
description:
"Paid professional weather-signal intelligence terminal. 51 cities, real-time observations.",
images: ["/apple-touch-icon.png"],
},
robots: {
index: true,
follow: true,
"max-video-preview": -1,
"max-image-preview": "large",
"max-snippet": -1,
},
icons: {
icon: [
{ url: "/favicon.ico", type: "image/x-icon" },
+21
View File
@@ -33,8 +33,29 @@ export default async function HomePage({
const qs = usp.toString();
redirect(`/auth/callback${qs ? `?${qs}` : ""}`);
}
const jsonLd = {
"@context": "https://schema.org",
"@type": "WebApplication",
name: "PolyWeather",
description:
"Paid professional weather-signal intelligence terminal with METAR evidence, DEB forecast blending, and AI decision cards.",
url: "https://polyweather.top",
applicationCategory: "BusinessApplication",
operatingSystem: "Web",
offers: {
"@type": "Offer",
price: "10.00",
priceCurrency: "USD",
description: "Monthly subscription",
},
};
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
/>
<PreloadTerminalData />
<InstitutionalLandingPage />
</>
+14
View File
@@ -0,0 +1,14 @@
import type { MetadataRoute } from "next";
export default function robots(): MetadataRoute.Robots {
return {
rules: [
{
userAgent: "*",
allow: "/",
disallow: ["/terminal/", "/account/", "/ops/", "/api/"],
},
],
sitemap: "https://polyweather.top/sitemap.xml",
};
}
+20
View File
@@ -0,0 +1,20 @@
import type { MetadataRoute } from "next";
export default function sitemap(): MetadataRoute.Sitemap {
const baseUrl = "https://polyweather.top";
return [
{
url: baseUrl,
lastModified: new Date(),
changeFrequency: "weekly",
priority: 1.0,
},
{
url: `${baseUrl}/auth/login`,
lastModified: new Date(),
changeFrequency: "monthly",
priority: 0.6,
},
];
}