我有一个用于 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_param
为SCRIPT_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
。请参阅这个文件了解详情。