配置 nginx 以允许机器人访问单个 Laravel 4 路由

配置 nginx 以允许机器人访问单个 Laravel 4 路由

我有一个用于 Laravel 4 部署的 nginx 配置。它运行良好,但我试图进行更改以防止 Twitterbot 访问 robots.txt 文件以外的任何内容(他们向我们发送垃圾邮件以更新共享卡,并且显然将 robots.txt 文件缓存了太长时间)。问题是,由于 Laravel 通过 index.php 路由所有内容,包括 robots.txt 文件(内置于 Blade 模板中),我不确定如何匹配该文件的 Laravel 路由。以下是我正在处理的内容。为了保护隐私,只阻止了不太重要的部分:

server {
  server_name
    domain1.com
    domain2.com
    # More domains...
  ;

  root /srv/web/self-service/master/public;
  index index.html index.php;

  location / {
    # Pretty URIs, Passes Things to the ".php" location block
    try_files $uri $uri/ /index.php?$args;
  }

  # My attempt at matching the robots.txt URL
  location ~ index\.php/robots\.txt$ {
    # Don't block Twitterbot here

    # FastCGI Params Here

    set $route "out-php-load-balancer:9000";
    fastcgi_pass $route;
  }

  location ~ \.php$ {
    # Block Twitterbot here
    if ($http_user_agent ~ "Twitterbot") {return 403;}

    # FastCGI Params Here

    set $route "our-php-load-balancer:9000";
    fastcgi_pass $route;
  }
}

我需要输入什么位置才能让它绕过 Twitterbot 检查?有没有更好的方法?我知道这样做不好,但我认为在这种情况下我别无选择。我很乐意被证明是错的。

提前致谢。

答案1

robots.txt 的正确 URI 是/robots.txt。您的方法似乎完全有效,但您需要将 for 硬编码fastcgi_paramSCRIPT_FILENAME指向/index.php。例如:

# My attempt at matching the robots.txt URL
location = /robots.txt {
    # Don't block Twitterbot here

    # FastCGI Params Here
    fastcgi_param  SCRIPT_FILENAME $document_root/index.php;

    set $route "out-php-load-balancer:9000";
    fastcgi_pass $route;
}

在包含其他 fastcgi 参数文件后进行设置SCRIPT_FILENAME,以便它不会被覆盖。

这个文件用于位置指令。

此外,return 403这也是你被允许做位于区块中if。请参阅这个文件了解详情。

相关内容