将请求 uri 作为查询参数传递给 Nginx 代理

将请求 uri 作为查询参数传递给 Nginx 代理

如果用户代理是爬虫,我想将 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实用程序配合使用。

相关内容