在 Express 中处理 robots.txt 最明智的方法是什么?

我目前正在开发一个用 Express (Node.js)构建的应用程序,我想知道在不同的环境(开发、生产)中处理不同 robots.txt 的最聪明的方法是什么。

这就是我现在所拥有的,但我不相信这个解决方案,我认为它是肮脏的:

app.get '/robots.txt', (req, res) ->
res.set 'Content-Type', 'text/plain'
if app.settings.env == 'production'
res.send 'User-agent: *\nDisallow: /signin\nDisallow: /signup\nDisallow: /signout\nSitemap: /sitemap.xml'
else
res.send 'User-agent: *\nDisallow: /'

(注意: 这是咖啡脚本)

应该有更好的办法,你会怎么做?

谢谢你。

32834 次浏览

看起来不错。

另一种方法是,如果您希望能够将 robots.txt编辑为常规文件,并且在生产或开发模式下可能只需要其他文件,那么可以使用两个单独的目录,并在启动时激活其中一个目录。

if (app.settings.env === 'production') {
app.use(express['static'](__dirname + '/production'));
} else {
app.use(express['static'](__dirname + '/development'));
}

然后在每个版本的 robots.txt 中添加2个目录。

PROJECT DIR
development
robots.txt  <-- dev version
production
robots.txt  <-- more permissive prod version

并且您可以继续在这两个目录中添加更多的文件,并使代码更简单。

(对不起,这是 javascript,不是 coffee escript)

使用一个中间件函数,这样 robots.txt 就可以在任何会话、 cookie 解析器等之前处理:

app.use('/robots.txt', function (req, res, next) {
res.type('text/plain')
res.send("User-agent: *\nDisallow: /");
});

使用 Express 4 app.get,你可以按照它出现的顺序来处理它,这样你就可以使用:

app.get('/robots.txt', function (req, res) {
res.type('text/plain');
res.send("User-agent: *\nDisallow: /");
});

使用中间件方式根据环境选择 robots.txt:

var env = process.env.NODE_ENV || 'development';


if (env === 'development' || env === 'qa') {
app.use(function (req, res, next) {
if ('/robots.txt' === req.url) {
res.type('text/plain');
res.send('User-agent: *\nDisallow: /');
} else {
next();
}
});
}

1. 创建包含以下内容的 robots.txt:

User-agent: *
Disallow: # your rules here

2. 将其添加到 public/目录。

3. 如果代码中尚未显示,请添加:

app.use(express.static('public'))

您的 robots.txt将可用于任何爬虫在 http://yoursite.com/robots.txt

这是我在索引路线上做的。你可以简单地在代码中写下我在下面给出的内容。

router.get('/', (req, res) =>
res.sendFile(__dirname + '/public/sitemap.xml')
)


router.get('/', (req, res) => {
res.sendFile(__dirname + '/public/robots.txt')
})

我使用 robots.txt 作为 Prod 的普通文件,以及其他 envs 的中间件。

if(isDev || isStaging){
app.use('/robots.txt', function (req, res) {
res.type('text/plain');
res.send("User-agent: *\nDisallow: /");
});
}
app.use(express.static(path.join(__dirname, 'public')));

这是我用的

router.use('/robots.txt', function (req, res, next) {
res.type('text/plain')
res.send(
`User-agent: *
Disallow: /admin`);
});
app.use(express.static('public'))
app.use('/images', express.static('public/images'))
app.use('/videos', express.static('public/videos'))

enter image description here

更多地关注最方便、最简单的解决方案,而不是“最好”或“最聪明”的解决方案。我只是将以下内容添加到 server.ts 文件中。

server.get('/robots.txt', function (req, res) {
res.type('text/plain');
res.send("User-agent: *\nAllow: /");
})

这样做的目的是动态创建一个 robots.txt 文件,并在需要/robots.txt 文件时发送它。 现在,为了使其工作,代码片段必须放在其他 server.get 函数调用之前(因此它具有优先级)。我正在使用 Angular 实现 Express,对我来说完整的代码片段是:

export function app(): express.Express {
const server = express();
const distFolder = join(process.cwd(), 'dist/sophisticatedPrimate/browser');
const indexHtml = existsSync(join(distFolder, 'index.original.html')) ? 'index.original.html' : 'index';


// Our Universal express-engine (found @ https://github.com/angular/universal/tree/main/modules/express-engine)
server.engine('html', ngExpressEngine({
bootstrap: AppServerModule,
}));


server.set('view engine', 'html');
server.set('views', distFolder);


server.get('/robots.txt', function (req, res) {
res.type('text/plain');
res.send("User-agent: *\nAllow: /");
})


// Example Express Rest API endpoints
// server.get('/api/**', (req, res) => { });
// Serve static files from /browser
server.get('*.*', express.static(distFolder, {
maxAge: '1y'
}));


// All regular routes use the Universal engine
server.get('*', (req, res) => {
res.render(indexHtml, { req, providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }] });
});


return server;
}