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

时间:2013-02-27 18:41:41

标签: node.js 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: /'

(注意:这是CoffeeScript)

应该有更好的方法。你会怎么做?

谢谢。

7 个答案:

答案 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)

  1. 使用以下内容创建robots.txt

    User-agent: *
    Disallow:
    
  2. 将其添加到public/目录。

  3. 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();
    }
  });
}