Skip to content

Commit 40bc609

Browse files
authoredAug 17, 2024··
feat: header, disable setting X-Robots-Tag header (#134)
1 parent b24ad45 commit 40bc609

File tree

4 files changed

+54
-14
lines changed

4 files changed

+54
-14
lines changed
 

Diff for: ‎src/module.ts

+22-12
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@ export interface ModuleOptions {
2929
* @default true
3030
*/
3131
enabled: boolean
32+
/**
33+
* Should a `X-Robots-Tag` header be added to the response.
34+
*
35+
* @default true
36+
*/
37+
header: boolean
3238
/**
3339
* Should a `<meta name="robots" content="<>">` tag be added to the head.
3440
*
@@ -161,6 +167,7 @@ export default defineNuxtModule<ModuleOptions>({
161167
groups: [],
162168
blockNonSeoBots: false,
163169
mergeWithRobotsTxtPath: true,
170+
header: true,
164171
metaTag: true,
165172
cacheControl: 'max-age=14400, must-revalidate',
166173
robotsEnabledValue: 'index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1',
@@ -362,18 +369,20 @@ export default defineNuxtModule<ModuleOptions>({
362369

363370
nuxt.options.routeRules = nuxt.options.routeRules || {}
364371
// convert robot routeRules to header routeRules for static hosting
365-
Object.entries(nuxt.options.routeRules).forEach(([route, rules]) => {
366-
const url = route.split('/').map(segment => segment.startsWith(':') ? '*' : segment).join('/')
367-
const groupIndexable = indexableFromGroup(config.groups, url)
368-
const robotRules = normaliseRobotsRouteRule(rules, groupIndexable, config.robotsDisabledValue, config.robotsEnabledValue)
369-
// single * is supported but ignored
370-
// @ts-expect-error untyped
371-
nuxt.options.routeRules[route] = defu({
372-
headers: {
373-
'X-Robots-Tag': robotRules.rule,
374-
},
375-
}, nuxt.options.routeRules?.[route])
376-
})
372+
if (config.header) {
373+
Object.entries(nuxt.options.routeRules).forEach(([route, rules]) => {
374+
const url = route.split('/').map(segment => segment.startsWith(':') ? '*' : segment).join('/')
375+
const groupIndexable = indexableFromGroup(config.groups, url)
376+
const robotRules = normaliseRobotsRouteRule(rules, groupIndexable, config.robotsDisabledValue, config.robotsEnabledValue)
377+
// single * is supported but ignored
378+
// @ts-expect-error untyped
379+
nuxt.options.routeRules[route] = defu({
380+
headers: {
381+
'X-Robots-Tag': robotRules.rule,
382+
},
383+
}, nuxt.options.routeRules?.[route])
384+
})
385+
}
377386

378387
const extraDisallows = new Set<string>()
379388
if (config.disallowNonIndexableRoutes) {
@@ -408,6 +417,7 @@ export default defineNuxtModule<ModuleOptions>({
408417
credits: config.credits,
409418
groups: config.groups,
410419
sitemap: config.sitemap,
420+
header: config.header,
411421
robotsEnabledValue: config.robotsEnabledValue,
412422
robotsDisabledValue: config.robotsDisabledValue,
413423
// @ts-expect-error untyped

Diff for: ‎src/runtime/nitro/server/middleware.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
import { defineEventHandler, setHeader } from 'h3'
22
import { getPathRobotConfig } from '#internal/nuxt-robots'
3+
import { useRuntimeConfig } from '#imports'
34

45
export default defineEventHandler(async (e) => {
56
if (e.path === '/robots.txt' || e.path.startsWith('/__') || e.path.startsWith('/api') || e.path.startsWith('/_nuxt'))
67
return
78
const robotConfig = getPathRobotConfig(e)
8-
setHeader(e, 'X-Robots-Tag', robotConfig.rule)
9+
const { header } = useRuntimeConfig(e)['nuxt-robots']
10+
if (header) {
11+
setHeader(e, 'X-Robots-Tag', robotConfig.rule)
12+
}
913
e.context.robots = robotConfig
1014
})

Diff for: ‎src/runtime/nuxt/composables/useRobotsRule.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@ export function useRobotsRule(rule?: MaybeRef<boolean | string>) {
3737
_rule = _rule ? config['nuxt-robots'].robotsEnabledValue : config['nuxt-robots'].robotsDisabledValue
3838
}
3939
event.context.robots.rule = _rule
40-
setHeader(event, 'X-Robots-Tag', _rule)
40+
if (config['nuxt-robots'].header) {
41+
setHeader(event, 'X-Robots-Tag', _rule)
42+
}
4143
useServerHead({
4244
meta: [
4345
{

Diff for: ‎test/noHeader.test.ts

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { describe, expect, it } from 'vitest'
2+
import { setup } from '@nuxt/test-utils'
3+
import { createResolver } from '@nuxt/kit'
4+
5+
const { resolve } = createResolver(import.meta.url)
6+
7+
process.env.NODE_ENV = 'production'
8+
await setup({
9+
rootDir: resolve('../.playground'),
10+
build: true,
11+
nuxtConfig: {
12+
robots: {
13+
debug: true,
14+
header: false,
15+
},
16+
},
17+
})
18+
19+
describe('noHeader', () => {
20+
it('basic', async () => {
21+
const { headers, _data } = await $fetch.raw('/')
22+
expect(headers.get('X-Robots-Tag')).toBe(null)
23+
})
24+
})

0 commit comments

Comments
 (0)
Please sign in to comment.