ヘッダーは主にルートモジュールのheaders
エクスポートで定義されます。entry.server.tsx
でヘッダーを設定することもできます。
import { Route } from "./+types/some-route";
export function headers(_: Route.HeadersArgs) {
return {
"Content-Security-Policy": "default-src 'self'",
"X-Frame-Options": "DENY",
"X-Content-Type-Options": "nosniff",
"Cache-Control": "max-age=3600, s-maxage=86400",
};
}
Headers
インスタンスまたはHeadersInit
を返すことができます。
ヘッダーがローダーデータに依存する場合、ローダーとアクションもヘッダーを設定できます。
data
で戻り値をラップするimport { data } from "react-router";
export async function loader({ params }: LoaderArgs) {
let [page, ms] = await fakeTimeCall(
await getPage(params.id)
);
return data(page, {
headers: {
"Server-Timing": `page;dur=${ms};desc="Page query"`,
},
});
}
headers
エクスポートから戻るローダーとアクションからのヘッダーは隠されて送信されません。headers
エクスポートからそれらを返す必要があります。
export function headers({
actionHeaders,
loaderHeaders,
}: HeadersArgs) {
return actionHeaders ? actionHeaders : loaderHeaders;
}
以下のようなネストされたルートを考えてみましょう。
route("pages", "pages-layout-with-nav.tsx", [
route(":slug", "page.tsx"),
]);
両方のルートモジュールがヘッダーを設定したい場合、最も深く一致するルートのヘッダーが送信されます。
親と子の両方のヘッダーを保持する必要がある場合は、子ルートでそれらをマージする必要があります。
最も簡単な方法は、親ヘッダーに単純に追加することです。これにより、親が設定した可能性のあるヘッダーを上書きすることを避け、両方が重要になります。
export function headers({ parentHeaders }: HeadersArgs) {
parentHeaders.append(
"Permissions-Policy: geolocation=()"
);
return parentHeaders;
}
親ヘッダーを上書きすることが重要な場合もあります。append
の代わりに set
でこれを行います。
export function headers({ parentHeaders }: HeadersArgs) {
parentHeaders.set(
"Cache-Control",
"max-age=3600, s-maxage=86400"
);
return parentHeaders;
}
ヘッダーのマージを避けるには、「リーフルート」(インデックスルートと子を持たない子ルート)でのみヘッダーを定義し、親ルートでは定義しないようにすることができます。
entry.server.tsx
からhandleRequest
エクスポートは、ルートモジュールからのヘッダーを引数として受け取ります。ここでグローバルヘッダーを追加できます。
export default function handleRequest(
request,
responseStatusCode,
responseHeaders,
routerContext,
loadContext
) {
// set, append global headers
responseHeaders.set(
"X-App-Version",
routerContext.manifest.version
);
return new Response(await getStream(), {
headers: responseHeaders,
status: responseStatusCode,
});
}
entry.server.tsx
がない場合は、reveal
コマンドを実行してください。
react-router reveal