sitemap-robots
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseSitemap & Robots
站点地图与Robots配置
Sitemap Generation
站点地图生成
tsx
// app/sitemap.ts
import type { MetadataRoute } from 'next';
import { locales } from '@/i18n.config';
import { getServices, getProgrammes } from '@/lib/data';
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL!;
// Static pages
const staticPages = [
'',
'/about',
'/services',
'/book',
'/pricing',
'/programmes',
'/testimonials',
'/faq',
'/policies',
'/contact',
];
// Generate URLs for all locales and static pages
const staticUrls = locales.flatMap((locale) =>
staticPages.map((page) => ({
url: `${siteUrl}/${locale}${page}`,
lastModified: new Date(),
changeFrequency: page === '' ? 'weekly' : 'monthly' as const,
priority: page === '' ? 1 : 0.8,
alternates: {
languages: Object.fromEntries(
locales.map((loc) => [loc, `${siteUrl}/${loc}${page}`])
),
},
}))
);
// Dynamic programme pages
const programmes = await getProgrammes('en');
const programmeUrls = locales.flatMap((locale) =>
programmes.map((programme) => ({
url: `${siteUrl}/${locale}/programmes/${programme.slug}`,
lastModified: new Date(programme.lastUpdated),
changeFrequency: 'monthly' as const,
priority: 0.7,
alternates: {
languages: Object.fromEntries(
locales.map((loc) => [
loc,
`${siteUrl}/${loc}/programmes/${programme.slug}`,
])
),
},
}))
);
// Dynamic service pages (if you have individual service pages)
const services = await getServices('en');
const serviceUrls = locales.flatMap((locale) =>
services.map((service) => ({
url: `${siteUrl}/${locale}/services/${service.slug}`,
lastModified: new Date(service.lastUpdated),
changeFrequency: 'monthly' as const,
priority: 0.7,
alternates: {
languages: Object.fromEntries(
locales.map((loc) => [
loc,
`${siteUrl}/${loc}/services/${service.slug}`,
])
),
},
}))
);
return [...staticUrls, ...programmeUrls, ...serviceUrls];
}tsx
// app/sitemap.ts
import type { MetadataRoute } from 'next';
import { locales } from '@/i18n.config';
import { getServices, getProgrammes } from '@/lib/data';
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL!;
// Static pages
const staticPages = [
'',
'/about',
'/services',
'/book',
'/pricing',
'/programmes',
'/testimonials',
'/faq',
'/policies',
'/contact',
];
// Generate URLs for all locales and static pages
const staticUrls = locales.flatMap((locale) =>
staticPages.map((page) => ({
url: `${siteUrl}/${locale}${page}`,
lastModified: new Date(),
changeFrequency: page === '' ? 'weekly' : 'monthly' as const,
priority: page === '' ? 1 : 0.8,
alternates: {
languages: Object.fromEntries(
locales.map((loc) => [loc, `${siteUrl}/${loc}${page}`])
),
},
}))
);
// Dynamic programme pages
const programmes = await getProgrammes('en');
const programmeUrls = locales.flatMap((locale) =>
programmes.map((programme) => ({
url: `${siteUrl}/${locale}/programmes/${programme.slug}`,
lastModified: new Date(programme.lastUpdated),
changeFrequency: 'monthly' as const,
priority: 0.7,
alternates: {
languages: Object.fromEntries(
locales.map((loc) => [
loc,
`${siteUrl}/${loc}/programmes/${programme.slug}`,
])
),
},
}))
);
// Dynamic service pages (if you have individual service pages)
const services = await getServices('en');
const serviceUrls = locales.flatMap((locale) =>
services.map((service) => ({
url: `${siteUrl}/${locale}/services/${service.slug}`,
lastModified: new Date(service.lastUpdated),
changeFrequency: 'monthly' as const,
priority: 0.7,
alternates: {
languages: Object.fromEntries(
locales.map((loc) => [
loc,
`${siteUrl}/${loc}/services/${service.slug}`,
])
),
},
}))
);
return [...staticUrls, ...programmeUrls, ...serviceUrls];
}Robots.txt
Robots.txt配置
tsx
// app/robots.ts
import type { MetadataRoute } from 'next';
export default function robots(): MetadataRoute.Robots {
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL!;
return {
rules: [
{
userAgent: '*',
allow: '/',
disallow: [
'/api/',
'/checkout/',
'/_next/',
],
},
],
sitemap: `${siteUrl}/sitemap.xml`,
};
}tsx
// app/robots.ts
import type { MetadataRoute } from 'next';
export default function robots(): MetadataRoute.Robots {
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL!;
return {
rules: [
{
userAgent: '*',
allow: '/',
disallow: [
'/api/',
'/checkout/',
'/_next/',
],
},
],
sitemap: `${siteUrl}/sitemap.xml`,
};
}LLMs.txt for AI Crawlers
面向AI爬虫的LLMs.txt
txt
// public/llms.txttxt
// public/llms.txtStudio Name - Pilates & Yoga Coaching
Studio Name - Pilates & Yoga Coaching
About
About
Professional Pilates and Yoga coaching studio offering personalized 1:1 sessions,
small group classes, and digital programmes. Evidence-informed approach focused on
strength, mobility, posture, and stress relief.
Professional Pilates and Yoga coaching studio offering personalized 1:1 sessions,
small group classes, and digital programmes. Evidence-informed approach focused on
strength, mobility, posture, and stress relief.
Languages
Languages
- Portuguese (pt-PT) - Default
- English (en)
- Turkish (tr)
- Spanish (es)
- French (fr)
- German (de)
- Portuguese (pt-PT) - Default
- English (en)
- Turkish (tr)
- Spanish (es)
- French (fr)
- German (de)
Important Pages
Important Pages
- Home: /[locale]/
- About: /[locale]/about
- Services: /[locale]/services
- Pricing: /[locale]/pricing
- Programmes: /[locale]/programmes
- Book: /[locale]/book
- FAQ: /[locale]/faq
- Contact: /[locale]/contact
- Home: /[locale]/
- About: /[locale]/about
- Services: /[locale]/services
- Pricing: /[locale]/pricing
- Programmes: /[locale]/programmes
- Book: /[locale]/book
- FAQ: /[locale]/faq
- Contact: /[locale]/contact
Services Offered
Services Offered
- 1:1 Pilates Sessions (mat and reformer)
- 1:1 Yoga Sessions
- Small Group Classes
- Online Coaching
- Digital Programmes (on-demand video courses)
- 1:1 Pilates Sessions (mat and reformer)
- 1:1 Yoga Sessions
- Small Group Classes
- Online Coaching
- Digital Programmes (on-demand video courses)
Booking
Booking
Sessions can be booked via the /book page. Available in-person and online.
Sessions can be booked via the /book page. Available in-person and online.
Contact
Contact
Email: hello@studioname.com
Location: Istanbul, Turkey
Email: hello@studioname.com
Location: Istanbul, Turkey
Disclaimer
Disclaimer
Content is educational and not medical advice. Consult a qualified professional
before starting any exercise programme.
undefinedContent is educational and not medical advice. Consult a qualified professional
before starting any exercise programme.
undefinedExtended LLMs-Full.txt
扩展版LLMs-Full.txt
tsx
// scripts/generate-llms-full.ts
// Run this as a build step to generate comprehensive content
import { locales } from '@/i18n.config';
import { getServices, getProgrammes, getFAQs } from '@/lib/data';
import fs from 'fs';
async function generateLlmsFull() {
let content = `# Studio Name - Complete Content Reference\n\n`;
content += `Generated: ${new Date().toISOString()}\n\n`;
// Services
content += `## Services\n\n`;
const services = await getServices('en');
for (const service of services) {
content += `### ${service.name}\n`;
content += `${service.longDesc}\n`;
content += `- Duration: ${service.duration}\n`;
content += `- Price from: €${service.priceFrom}\n`;
content += `- Delivery: ${service.delivery}\n`;
content += `- Tags: ${service.tags.join(', ')}\n\n`;
}
// Programmes
content += `## Digital Programmes\n\n`;
const programmes = await getProgrammes('en');
for (const programme of programmes) {
content += `### ${programme.title}\n`;
content += `- Level: ${programme.level}\n`;
content += `- Duration: ${programme.durationText}\n`;
content += `- Access: ${programme.accessLengthText}\n`;
content += `- Equipment: ${programme.equipment.join(', ')}\n`;
content += `- Outcomes: ${programme.outcomes.join('; ')}\n`;
content += `- Price: €${programme.price}\n\n`;
}
// FAQs
content += `## Frequently Asked Questions\n\n`;
const faqs = await getFAQs('en');
for (const group of faqs) {
content += `### ${group.category}\n\n`;
for (const item of group.items) {
content += `**Q: ${item.question}**\n`;
content += `A: ${item.answer}\n\n`;
}
}
fs.writeFileSync('public/llms-full.txt', content);
console.log('Generated llms-full.txt');
}
generateLlmsFull();tsx
// scripts/generate-llms-full.ts
// Run this as a build step to generate comprehensive content
import { locales } from '@/i18n.config';
import { getServices, getProgrammes, getFAQs } from '@/lib/data';
import fs from 'fs';
async function generateLlmsFull() {
let content = `# Studio Name - Complete Content Reference\n\n`;
content += `Generated: ${new Date().toISOString()}\n\n`;
// Services
content += `## Services\n\n`;
const services = await getServices('en');
for (const service of services) {
content += `### ${service.name}\n`;
content += `${service.longDesc}\n`;
content += `- Duration: ${service.duration}\n`;
content += `- Price from: €${service.priceFrom}\n`;
content += `- Delivery: ${service.delivery}\n`;
content += `- Tags: ${service.tags.join(', ')}\n\n`;
}
// Programmes
content += `## Digital Programmes\n\n`;
const programmes = await getProgrammes('en');
for (const programme of programmes) {
content += `### ${programme.title}\n`;
content += `- Level: ${programme.level}\n`;
content += `- Duration: ${programme.durationText}\n`;
content += `- Access: ${programme.accessLengthText}\n`;
content += `- Equipment: ${programme.equipment.join(', ')}\n`;
content += `- Outcomes: ${programme.outcomes.join('; ')}\n`;
content += `- Price: €${programme.price}\n\n`;
}
// FAQs
content += `## Frequently Asked Questions\n\n`;
const faqs = await getFAQs('en');
for (const group of faqs) {
content += `### ${group.category}\n\n`;
for (const item of group.items) {
content += `**Q: ${item.question}**\n`;
content += `A: ${item.answer}\n\n`;
}
}
fs.writeFileSync('public/llms-full.txt', content);
console.log('Generated llms-full.txt');
}
generateLlmsFull();Package.json Script
Package.json脚本配置
json
{
"scripts": {
"generate:llms": "tsx scripts/generate-llms-full.ts",
"build": "npm run generate:llms && next build"
}
}json
{
"scripts": {
"generate:llms": "tsx scripts/generate-llms-full.ts",
"build": "npm run generate:llms && next build"
}
}Verification
验证步骤
After deployment, verify:
- - All locale URLs present
https://yoursite.com/sitemap.xml - - Sitemap reference correct
https://yoursite.com/robots.txt - - Human-readable summary
https://yoursite.com/llms.txt - Google Search Console - Submit sitemap
部署完成后,请验证以下内容:
- - 包含所有本地化URL
https://yoursite.com/sitemap.xml - - 站点地图引用正确
https://yoursite.com/robots.txt - - 内容为易读的摘要信息
https://yoursite.com/llms.txt - Google搜索控制台 - 提交站点地图