我需要一种动态/robots.txt
响应请求的方法。
这就是为什么我决定和 getServerSideProps
https://nextjs.org/docs/basic-features/data-fetching#getserversideprops-server-side-rendering
如果您从页面导出名为 getServerSideProps 的异步函数,Next.js 将使用 getServerSideProps 返回的数据在每个请求上预渲染此页面。
export async function getServerSideProps(context) {
return {
props: {}, // will be passed to the page component as props
}
}
在context
参数中,我们有req
和res
对象。
的响应robots.txt
将取决于req.headers.host
值。
例如:
www.mydomain.com
应该呈现一个生产robots.txt
文件test.mydomain.com
应该呈现一个测试robots.txt
文件(我将在测试/暂存部署中使用)。
这是我当前的代码:
页面/robots.txt.tsx
import React from "react";
import { GetServerSideProps } from "next";
interface Robots {
ENV: "TEST" | "PROD"
}
export const getServerSideProps : GetServerSideProps<Robots> = async (context) => {
const { req, res } = context;
const { host } = req.headers;
res.write("XXX");
res.end();
return({ // This is unnecessary (but Next.js requires it to be here)
props: {
ENV: "TEST"
}
});
};
const Robots: React.FC<Robots> = (props) => { // This is also unnecessary (but Next.js requires it to be here)
console.log("Rendering Robots...");
return(
<div>
I am Robots
</div>
);
};
export default Robots; // This is also unnecessary (but Next.js requires it to be here).
它似乎有效:
但奇怪的是,它Next.js
要求我从该页面导出一个组件。并且还需要返回一个props: {}
对象getServerSideProps
。
去这里的路是什么?我基本上使用req,res
fromgetServerSideProps
来返回不是页面的内容。这是一种反模式吗?
更新
是的,这是一种反模式。你应该使用rewrites
. 查看所选答案。