如果用户代理是爬虫,我想将 URL 像查询参数一样传递给代理。我有:
if ($http_user_agent ~* "googlebot|yahoo|bingbot|baiduspider|yandex|yeti|yodaobot|gigabot|ia_archiver|facebookexternalhit|twitterbot|Facebot|developers\.google\.com") {
// Get the request Url, such as http://my-page.com/foo/bar/
// pass to the proxy as query param such as: http://localhost:3030?page=http://my-page.com/foo/bar/:
}
答案1
这很棘手。我认为您不想生成 HTTP 301 或 302 重定向,但可以使用以下配置轻松完成:
if ($http_user_agent ~* googlebot|yahoo|bingbot|baiduspider|yandex|yeti|yodaobot|gigabot|ia_archiver|facebookexternalhit|twitterbot|Facebot|developers\.google\.com) {
return 301 http://localhost:3000?page=$scheme://$http_host$request_uri;
}
但是想要一个“透明”的代理,当爬虫程序看不到重定向而是得到正常(HTTP 200 OK)响应时。
我们不能使用proxy_set_header
指令在if
块内,没有它我们就无法实现“透明”代理,但我们可以使用以下解决方法:
if ($http_user_agent ~* googlebot|yahoo|bingbot|baiduspider|yandex|yeti|yodaobot|gigabot|ia_archiver|facebookexternalhit|twitterbot|Facebot|developers\.google\.com) {
set $args page=$scheme://$http_host$request_uri;
rewrite (.*) /passtoproxy$1 last;
}
location ~ ^/passtoproxy/.* {
proxy_set_header Host localhost;
proxy_set_header X-Real-IP $remote_addr; # optional, if needed
proxy_pass http://localhost:3000?$args;
}
在这个例子中,定义了一个虚拟/passtoproxy
位置(当然,这个路径不能存在于你真实的站点内),但你可以选择一些更独特的东西,比如随机生成的足够长度的字符串。
例如,如果您想将请求传递给不同的代理my-proxy.com
,您还必须将第一个proxy_set_header
指令更改为proxy_set_header Host my-proxy.com;
。
更新
您可能需要添加resolver
指令到你的server
块以使其工作。
为了测试,您可以将“curl”添加到机器人列表中,并检查此配置如何与curl
实用程序配合使用。