我目前正在研究使用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: /'
(注意:这是CoffeeScript)
应该有更好的方法。你会怎么做?
谢谢。
答案 0 :(得分:86)
使用中间件功能。这样robots.txt将在任何会话,cookieParser等之前处理:
app.use('/robots.txt', function (req, res, next) {
res.type('text/plain')
res.send("User-agent: *\nDisallow: /");
});
快递4 app.get
现在按照它出现的顺序处理,所以你可以使用它:
app.get('/robots.txt', function (req, res) {
res.type('text/plain');
res.send("User-agent: *\nDisallow: /");
});
答案 1 :(得分:7)
使用以下内容创建robots.txt
:
User-agent: *
Disallow:
将其添加到public/
目录。
robots.txt
http://yoursite.com/robots.txt
将可供抓取工具使用
答案 2 :(得分:2)
看起来不错。
另一种方法是,如果您希望能够将robots.txt
编辑为常规文件,并且可能在生产或开发模式下只需要其他文件,则可以使用2个单独的目录,并激活一个或另一个在启动时。
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,而不是coffeescript)
答案 3 :(得分:0)
这就是我在索引路由上所做的事情。您只需在代码中写下我在下面给出的内容即可。
router.get('/', (req, res) =>
res.sendFile(__dirname + '/public/sitemap.xml')
)
router.get('/', (req, res) => {
res.sendFile(__dirname + '/public/robots.txt')
})
答案 4 :(得分:0)
我将robots.txt用作Prod的普通文件,并将其用作其他环境的中间件。
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')));
答案 5 :(得分:0)
这是我使用的
class FileSettingsViewModel:SettingsTabViewModelBase
{
public FileSettingsViewModel()
{
FileNameComponents = new ObservableCollection<IFileNameComponent>();
exampleComponent = this.FileNameComponents
.ToObservableChangeSet(x => x)
.ToCollection()
.Select(y => BuildComponentString(y))
.ToProperty(this, x => x.ExampleComponent);
}
private readonly ObservableAsPropertyHelper<string> exampleComponent;
public string ExampleComponent => exampleComponent.Value;
public ObservableCollection<IFileNameComponent> FileNameComponents
{
get { return fileNameComponents; }
set
{
this.RaiseAndSetIfChanged(ref fileNameComponents, value);
}
}
private string BuildComponentString(IReadOnlyCollection<IFileNameComponent> components)
{
string Output = "";
foreach (IFileNameComponent FileNameComponent in components)
{
Output = Output + FileNameComponent.Token;
}
ReplaceComponents(Output);
return Output;
}
}
答案 6 :(得分:-1)
使用中间件方式选择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();
}
});
}