虎泰克博客

nginx使用正则进行多个域名的反向代理配置及其中的坑


nginx使用正则进行多个域名的反向代理配置及其中的坑

最近需要爬去博客园的文章,但是爬下来的文章内图片因为防盗链无法直接输出到html,因此使用nginx配置了一个反向代理:

location ~/news/
{
    proxy_pass https://img2020.cnblogs.com;
    proxy_set_header Host img2020.cnblogs.com;
    proxy_set_header REMOTE-HOST $remote_addr;
    
    #所有请求带上伪造的REFERER,绕过防盗链
    proxy_set_header Referer "https://news.cnblogs.com/n/684649/";
    
    add_header X-Cache $upstream_cache_status;
    
    #Set Nginx Cache
    
    
    proxy_ignore_headers Set-Cookie Cache-Control expires;

    #去除没用的头部信息
    proxy_hide_header Server;
    proxy_hide_header X-Cache-Lookup;
    proxy_hide_header x-cos-hash-crc64ecma;
    proxy_hide_header x-cos-request-id;
    proxy_hide_header x-cos-verify-algo;
    proxy_hide_header X-Daa-Tunnel;
    proxy_hide_header X-NWS-LOG-UUID;
    proxy_hide_header X-NWS-UUID-VERIFY;

    proxy_cache cache_one;
    proxy_cache_key $host$uri$is_args$args;
    proxy_cache_valid 200 304 301 302 14400m;
    expires 14400m;
}

然后对文章内图片的域名进行替换

str_replace('img2020.cnblogs.com', 'pic.whutech.com', $content);

结果访问早期爬取的新闻发现有些图片无法加载,经过排查后发现博客园的图片库有多个域名,如:img2020.cnblogs.com、img2018.cnblogs.com、images2018.cnblogs.com,但是目录结构都一致,因此使用正则来匹配域名,并在proxy_pass内进行变量替换。

#博客园图片反代
location ~/im(.*).cnblogs.com/
{
    proxy_pass https:/$uri;
    proxy_set_header Host im$1.cnblogs.com;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header Referer "https://news.cnblogs.com/n/684649/";
    
    add_header X-Cache $upstream_cache_status;
    
    #Set Nginx Cache
    
    
    proxy_ignore_headers Set-Cookie Cache-Control expires;

    proxy_hide_header Server;
    proxy_hide_header X-Cache-Lookup;
    proxy_hide_header x-cos-hash-crc64ecma;
    proxy_hide_header x-cos-request-id;
    proxy_hide_header x-cos-verify-algo;
    proxy_hide_header X-Daa-Tunnel;
    proxy_hide_header X-NWS-LOG-UUID;
    proxy_hide_header X-NWS-UUID-VERIFY;

    proxy_cache cache_one;
    proxy_cache_key $host$uri$is_args$args;
    proxy_cache_valid 200 304 301 302 14400m;
    expires 14400m;
}

配置完成后发现还是无法访问,报502 Bad Gateway,经过查看error.log,发现有如下报错:

2021/01/27 08:16:27 [error] 20195#0: *1 no resolver defined to resolve images2018.cnblogs.com, client: 112.5.160.37, server: pic.whutech.com, request: "GET /images2018.cnblogs.com/news/66372/201808/66372-20180817102014013-1555092267.jpg HTTP/2.0", host: "pic.whutech.com"

判断是dns问题,搜索后发现是因为proxy_pass使用变量时需要指定dns,否则无法解析,有如下方案,在http{}内添加如下代码即可指定服务器

resolver 223.5.5.5;

最后的所有反向文件代理配置是

#变量域名指定dns
resolver 223.5.5.5;

#博客园图片反代
location ~/im(.*).cnblogs.com/
{
    proxy_pass https:/$uri;
    proxy_set_header Host im$1.cnblogs.com;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header Referer "https://news.cnblogs.com/n/684649/";
    
    add_header X-Cache $upstream_cache_status;
    
    #Set Nginx Cache
    
    
    proxy_ignore_headers Set-Cookie Cache-Control expires;

    proxy_hide_header Server;
    proxy_hide_header X-Cache-Lookup;
    proxy_hide_header x-cos-hash-crc64ecma;
    proxy_hide_header x-cos-request-id;
    proxy_hide_header x-cos-verify-algo;
    proxy_hide_header X-Daa-Tunnel;
    proxy_hide_header X-NWS-LOG-UUID;
    proxy_hide_header X-NWS-UUID-VERIFY;

    proxy_cache cache_one;
    proxy_cache_key $host$uri$is_args$args;
    proxy_cache_valid 200 304 301 302 14400m;
    expires 14400m;
}

图片反向代理配置完成后在对文章内容进行输出时进行一个域名替换就好了。

str_replace('://im', '://pic.whutech.com/im', $content);

最后效果如下:

虎sx泰e_cy克kmb新vbiln闻vof网ehj版权所有,请勿未授权转载!!!

image.png



ถ้าคุณมีข้อมูลอื่นๆใดๆเกี่ยวกับเรื่องนี้กรุณาเพิ่มฟรี

เข้าสู่ระบบเพื่อแสดงความคิดเห็น

แสดงความคิดเห็น

    ไม่มีข้อมูล