Skip to content

Commit ff71cac

Browse files
committed
feat: switch canonical SEO to primary domain
1 parent bf396b1 commit ff71cac

9 files changed

Lines changed: 52 additions & 17 deletions

File tree

‎.env.example‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ REDIS_URL=redis://:local_password@127.0.0.1:6379
44
REDIS_IMAGE=redis:7.0.15
55
REDIS_PORT=6379
66
REDIS_PASSWORD=local_password
7-
PUBLIC_SITE_URL=https://staging.example.com
8-
PUBLIC_ALLOW_INDEXING=false
7+
PUBLIC_SITE_URL=https://webworker.tech
8+
PUBLIC_ALLOW_INDEXING=true
99
JWT_SECRET=change-me-to-a-long-random-secret
1010
ADMIN_USERNAME=admin
1111
ADMIN_PASSWORD=change-me

‎astro.config.mjs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import vue from '@astrojs/vue'
55
import tailwindcss from '@tailwindcss/vite'
66

77
export default defineConfig({
8-
site: process.env.PUBLIC_SITE_URL || 'https://new.webworker.tech',
8+
site: process.env.PUBLIC_SITE_URL || 'https://webworker.tech',
99
integrations: [vue()],
1010
output: 'server',
1111
adapter: node({

‎docker-compose.prod.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ services:
2222
RSS_URL: ${RSS_URL:-https://feed.xyzfm.space/rv449dl9kqka}
2323
EPISODES_DIR: /app/content/episodes
2424
REDIS_URL: ${REDIS_URL:?REDIS_URL is required}
25-
PUBLIC_SITE_URL: ${PUBLIC_SITE_URL:-https://staging.example.com}
26-
PUBLIC_ALLOW_INDEXING: ${PUBLIC_ALLOW_INDEXING:-false}
25+
PUBLIC_SITE_URL: ${PUBLIC_SITE_URL:-https://webworker.tech}
26+
PUBLIC_ALLOW_INDEXING: ${PUBLIC_ALLOW_INDEXING:-true}
2727
JWT_SECRET: ${JWT_SECRET:?JWT_SECRET is required}
2828
ADMIN_USERNAME: ${ADMIN_USERNAME:-admin}
2929
ADMIN_PASSWORD: ${ADMIN_PASSWORD:?ADMIN_PASSWORD is required}

‎src/layouts/Layout.astro‎

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,25 @@ export interface Props {
55
title: string
66
description?: string
77
image?: string
8+
type?: 'website' | 'article'
89
}
910
1011
const {
1112
title,
1213
description = '前端程序员闲聊的中文播客节目',
1314
image = '/logo500.webp',
15+
type = 'website',
1416
} = Astro.props
1517
16-
const allowIndexing = import.meta.env.PUBLIC_ALLOW_INDEXING === 'true'
18+
const allowIndexing = process.env.PUBLIC_ALLOW_INDEXING === 'true'
19+
const siteOrigin = (
20+
Astro.site?.toString() ||
21+
import.meta.env.PUBLIC_SITE_URL ||
22+
'https://webworker.tech'
23+
).replace(/\/$/, '')
24+
const canonicalUrl = new URL(Astro.url.pathname, siteOrigin).toString()
25+
const imageUrl = new URL(image, siteOrigin).toString()
26+
const rssUrl = process.env.RSS_URL || 'https://feed.xyzfm.space/rv449dl9kqka'
1727
---
1828

1929
<!doctype html>
@@ -28,26 +38,30 @@ const allowIndexing = import.meta.env.PUBLIC_ALLOW_INDEXING === 'true'
2838
}
2939
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
3040
<link rel="icon" type="image/webp" href="/logo500.webp" />
41+
<link rel="canonical" href={canonicalUrl} />
3142
<meta name="generator" content={Astro.generator} />
3243

3344
<link
34-
href="https://www.xiaoyuzhoufm.com/podcast/613753ef23c82a9a1ccfdf35"
45+
href={rssUrl}
3546
rel="alternate"
36-
title="Web Worker 播客 小宇宙"
47+
title="Web Worker 播客 RSS"
3748
type="application/rss+xml"
3849
/>
3950

4051
<!-- Open Graph -->
4152
<meta property="og:title" content={title} />
4253
<meta property="og:description" content={description} />
43-
<meta property="og:image" content={image} />
44-
<meta property="og:type" content="website" />
54+
<meta property="og:image" content={imageUrl} />
55+
<meta property="og:type" content={type} />
56+
<meta property="og:url" content={canonicalUrl} />
57+
<meta property="og:site_name" content="Web Worker" />
58+
<meta property="og:locale" content="zh_CN" />
4559

4660
<!-- Twitter Card -->
4761
<meta name="twitter:card" content="summary_large_image" />
4862
<meta name="twitter:title" content={title} />
4963
<meta name="twitter:description" content={description} />
50-
<meta name="twitter:image" content={image} />
64+
<meta name="twitter:image" content={imageUrl} />
5165

5266
<title>{title}</title>
5367
</head>

‎src/pages/episode/[id].astro‎

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import Layout from '@/layouts/Layout.astro'
33
import Header from '@/components/layout/Header.vue'
44
import Footer from '@/components/layout/Footer.vue'
55
import { getEpisodeById } from '@/utils/podcast'
6+
import { stripHtml } from '@/server/markdown'
67
import {
78
ChevronLeft,
89
Mic,
@@ -18,9 +19,18 @@ const episode = Astro.params.id
1819
if (!episode) {
1920
return Astro.redirect('/404')
2021
}
22+
23+
const episodeDescription =
24+
stripHtml(episode.description || episode.showNotes || '').slice(0, 160) ||
25+
'Web Worker 播客单集'
2126
---
2227

23-
<Layout title={episode.title}>
28+
<Layout
29+
title={`${episode.title} - Web Worker`}
30+
description={episodeDescription}
31+
image={episode.imageUrl}
32+
type="article"
33+
>
2434
<Header client:load />
2535

2636
<main class="container mx-auto px-4 py-8 pb-24">

‎src/pages/episodes.astro‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ const categories = [
2222
]
2323
---
2424

25-
<Layout title="全部播客 - MindTech">
25+
<Layout
26+
title="全部播客 - Web Worker"
27+
description={`收听 Web Worker 播客全部 ${allEpisodes.length} 期节目,按标题搜索前端技术、工程实践和开发者社区相关内容。`}
28+
>
2629
<Header client:load />
2730

2831
<main class="container mx-auto px-4 py-8 md:py-12 pb-24 md:pb-0">

‎src/pages/index.astro‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,10 @@ const testimonials: Testimonial[] = [
5252
]
5353
---
5454

55-
<Layout title="Web Worker - 前端程序员都爱听的播客平台">
55+
<Layout
56+
title="Web Worker - 前端程序员都爱听的播客"
57+
description="Web Worker 是几个前端程序员闲聊的中文音频播客,关注前端技术、工程实践、职业成长与技术社区。"
58+
>
5659
<Header client:load />
5760

5861
<main class="container mx-auto px-4 py-4 md:py-12">

‎src/pages/robots.txt.ts‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,14 @@ import type { APIRoute } from 'astro'
22

33
export const GET: APIRoute = ({ site }) => {
44
const allowIndexing = process.env.PUBLIC_ALLOW_INDEXING === 'true'
5-
const origin = site?.toString().replace(/\/$/, '') || 'https://new.webworker.tech'
5+
const origin = site?.toString().replace(/\/$/, '') || 'https://webworker.tech'
66
const lines = allowIndexing
7-
? ['User-agent: *', 'Allow: /', 'Disallow: /admin', 'Disallow: /api/admin']
7+
? [
8+
'User-agent: *',
9+
'Allow: /',
10+
'Disallow: /admin',
11+
'Disallow: /api/admin',
12+
]
813
: ['User-agent: *', 'Disallow: /']
914

1015
return new Response([...lines, `Sitemap: ${origin}/sitemap.xml`, ''].join('\n'), {

‎src/pages/sitemap.xml.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ function escapeXml(value: string) {
1212

1313
export const GET: APIRoute = async ({ site }) => {
1414
const origin =
15-
site?.toString().replace(/\/$/, '') || 'https://new.webworker.tech'
15+
site?.toString().replace(/\/$/, '') || 'https://webworker.tech'
1616
const episodes = await getAllEpisodes()
1717
const urls = [
1818
{ loc: '/', lastmod: new Date().toISOString() },

0 commit comments

Comments
 (0)