Bird
Raised Fist0
NextJSframework~5 mins

Sitemap.xml generation in NextJS

Choose your learning style10 modes available
Introduction

A sitemap.xml helps search engines find and understand your website pages easily. It improves your site's visibility on search results.

You want search engines like Google to index all your website pages quickly.
Your website has many pages or dynamic routes that change often.
You want to improve SEO by guiding search engines to important pages.
You have a blog or e-commerce site with frequently added content.
You want to provide metadata like last update time or page priority to search engines.
Syntax
NextJS
export async function GET() {
  const baseUrl = 'https://example.com';
  const routes = ['/', '/about', '/contact'];

  const sitemap = `<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n${routes.map(route => `  <url>\n    <loc>${baseUrl}${route}</loc>\n  </url>`).join('\n')}\n</urlset>`;

  return new Response(sitemap, {
    headers: {
      'Content-Type': 'application/xml'
    }
  });
}

This code exports a GET function for a Next.js route that returns XML content.

The sitemap XML must follow the standard sitemap protocol for search engines.

Examples
This example creates a sitemap string for three pages: home, blog, and products.
NextJS
const routes = ['/', '/blog', '/products'];

const sitemap = `<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n${routes.map(route => `  <url>\n    <loc>https://example.com${route}</loc>\n  </url>`).join('\n')}\n</urlset>`;
This sends the sitemap XML with the correct content type so browsers and crawlers understand it.
NextJS
return new Response(sitemap, {
  headers: { 'Content-Type': 'application/xml' }
});
Sample Program

This Next.js route handler generates a sitemap.xml dynamically listing four pages. When you visit this route, it returns the sitemap XML with correct headers.

NextJS
export async function GET() {
  const baseUrl = 'https://mywebsite.com';
  const routes = ['/', '/about', '/blog', '/contact'];

  const sitemap = `<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n${routes.map(route => `  <url>\n    <loc>${baseUrl}${route}</loc>\n  </url>`).join('\n')}\n</urlset>`;

  return new Response(sitemap, {
    headers: {
      'Content-Type': 'application/xml'
    }
  });
}
OutputSuccess
Important Notes

Make sure the sitemap URL is accessible publicly so search engines can find it.

Update the routes list whenever you add or remove pages to keep the sitemap accurate.

You can automate sitemap generation for dynamic routes by fetching data inside the GET function.

Summary

Sitemap.xml helps search engines find your pages faster.

In Next.js, create a GET route that returns XML with page URLs.

Set the response header to 'application/xml' for correct recognition.

Practice

(1/5)
1. What is the main purpose of generating a sitemap.xml in a Next.js application?
easy
A. To help search engines find and index your pages faster
B. To improve the visual design of your website
C. To add client-side routing capabilities
D. To store user session data securely

Solution

  1. Step 1: Understand sitemap.xml role

    A sitemap.xml file lists URLs of your website to guide search engines.
  2. Step 2: Connect sitemap.xml to Next.js usage

    In Next.js, sitemap.xml helps search engines find pages faster by providing URL info.
  3. Final Answer:

    To help search engines find and index your pages faster -> Option A
  4. Quick Check:

    Sitemap.xml purpose = Help search engines [OK]
Hint: Remember sitemap.xml is for search engines, not UI [OK]
Common Mistakes:
  • Confusing sitemap.xml with styling or UI files
  • Thinking sitemap.xml stores user data
  • Assuming sitemap.xml adds client-side routing
2. Which of the following is the correct way to set the response header for a sitemap.xml in a Next.js API route?
easy
A. res.setHeader('Content-Type', 'text/html')
B. res.setHeader('Content-Type', 'text/plain')
C. res.setHeader('Content-Type', 'application/json')
D. res.setHeader('Content-Type', 'application/xml')

Solution

  1. Step 1: Identify correct content type for sitemap.xml

    Sitemap.xml is an XML file, so the content type must be 'application/xml'.
  2. Step 2: Match header setting in Next.js API route

    Use res.setHeader('Content-Type', 'application/xml') to set correct header.
  3. Final Answer:

    res.setHeader('Content-Type', 'application/xml') -> Option D
  4. Quick Check:

    Content-Type for sitemap.xml = application/xml [OK]
Hint: Always use 'application/xml' for sitemap responses [OK]
Common Mistakes:
  • Using 'text/html' instead of 'application/xml'
  • Setting content type to 'application/json'
  • Forgetting to set content type header
3. Given this Next.js API route code snippet for sitemap.xml generation, what will be the output content type header?
export async function GET(req, res) {
  res.setHeader('Content-Type', 'application/xml');
  return new Response(`<urlset></urlset>`);
}
medium
A. 'application/json'
B. 'text/html'
C. No content type header set
D. 'application/xml'

Solution

  1. Step 1: Understand Next.js 13+ GET handler response

    In Next.js 13+, the GET function returns a Response object; setting headers on 'res' does not affect it.
  2. Step 2: Check if content type header is set on Response

    The Response constructor here lacks headers, so no content type header is sent.
  3. Final Answer:

    No content type header set -> Option C
  4. Quick Check:

    Setting header on 'res' ignored, Response lacks headers [OK]
Hint: Set headers inside Response, not on 'res' in Next.js GET [OK]
Common Mistakes:
  • Assuming res.setHeader affects Response output
  • Not adding headers inside Response constructor
  • Confusing old API routes with new app router
4. Identify the bug in this Next.js sitemap.xml route code and how to fix it:
export async function GET() {
  const sitemap = `<urlset><url><loc>/home</loc></url></urlset>`;
  return new Response(sitemap);
}
medium
A. Missing 'Content-Type' header; add it in Response headers
B. Incorrect XML tags; use <html> instead of <urlset>
C. Function must be named 'getSitemap' instead of 'GET'
D. Response must return JSON, not XML string

Solution

  1. Step 1: Check response headers for sitemap.xml

    The code returns XML string but does not set 'Content-Type' header to 'application/xml'.
  2. Step 2: Fix by adding headers in Response constructor

    Add { headers: { 'Content-Type': 'application/xml' } } to Response to fix the bug.
  3. Final Answer:

    Missing 'Content-Type' header; add it in Response headers -> Option A
  4. Quick Check:

    Set 'Content-Type' header for XML response [OK]
Hint: Always add 'Content-Type' header when returning XML [OK]
Common Mistakes:
  • Forgetting to set content type header
  • Using wrong XML tags for sitemap
  • Misnaming the GET function
5. You want to generate a dynamic sitemap.xml in Next.js that includes URLs from a database. Which approach correctly combines fetching data and returning a valid sitemap response?
hard
A. Fetch URLs, return JSON array directly without headers
B. Fetch URLs, build XML string, then return new Response with XML and 'application/xml' header
C. Fetch URLs, set res.setHeader('Content-Type', 'application/json'), return JSON string
D. Fetch URLs, build XML string, return plain string without Response object

Solution

  1. Step 1: Fetch URLs from database asynchronously

    Use async function to get URLs from database or API.
  2. Step 2: Build XML string with URLs and return Response with correct header

    Create XML sitemap string, then return new Response(xmlString, { headers: { 'Content-Type': 'application/xml' } }).
  3. Final Answer:

    Fetch URLs, build XML string, then return new Response with XML and 'application/xml' header -> Option B
  4. Quick Check:

    Dynamic sitemap = fetch + XML + Response with header [OK]
Hint: Build XML string and return Response with XML header [OK]
Common Mistakes:
  • Returning JSON instead of XML for sitemap
  • Not setting content type header
  • Returning plain string without Response object
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard