部分反向(pixiv.cat):

nginx反向代理設定檔

proxy_cache_path /path/to/cache levels=1:2 keys_zone=pximg:10m max_size=10g inactive=7d use_temp_path=off; server { listen 443 ssl http2; ssl_certificate /path/to/ssl_certificate.crt; ssl_certificate_key /path/to/ssl_certificate.key; server_name i.pixiv.cat; access_log off; location / { proxy_cache pximg; proxy_pass https://i.pximg.net; proxy_cache_revalidate on; proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; proxy_cache_lock on; add_header X-Cache-Status $upstream_cache_status; proxy_set_header Host i.pximg.net; proxy_set_header Referer "https://www.pixiv.net/"; proxy_set_header User-Agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"; proxy_cache_valid 200 7d; proxy_cache_valid 404 5m; } }
Code language: PHP (php)

Cloudflare Workers 反向代理

addEventListener("fetch", event => { let url = new URL(event.request.url); url.hostname = "i.pximg.net"; let request = new Request(url, event.request); event.respondWith( fetch(request, { headers: { 'Referer': 'https://www.pixiv.net/', 'User-Agent': 'Cloudflare Workers' } }) ); });
Code language: JavaScript (javascript)

完全反向(https://moe.best/technology/pixiv-proxy.html):

NGINX配置

# *.example.com server { server_name ~^([^.]+)\.example\.com$; set $domain $1; resolver 8.8.8.8; location ~ .* { proxy_set_header Host $domain.pixiv.net; proxy_set_header Referer "https://www.pixiv.net"; proxy_cookie_domain pixiv.net example.com; proxy_pass https://$domain.pixiv.net; proxy_set_header Accept-Encoding ""; sub_filter "pixiv.net" "example.com"; sub_filter "pximg.net" "pximg.example.com"; # 防止错误上报暴露站点 sub_filter "js_error.php" "block_js_error"; # 防止谷歌服务暴露站点,同时也可以加快网站加载 sub_filter "www.google" "block_google"; sub_filter_once off; sub_filter_types *; } } # *.pximg.example.com server { server_name ~^([^.]+)\.pximg\.example\.com$; set $domain $1; resolver 8.8.8.8; location ~ .* { proxy_set_header Host $domain.pximg.net; proxy_set_header Referer "https://www.pixiv.net"; proxy_pass https://$domain.pximg.net; proxy_set_header Accept-Encoding ""; sub_filter "pixiv.net" "example.com"; sub_filter "pximg.net" "pximg.example.com"; # 防止错误上报暴露站点 sub_filter "js_error.php" "block_js_error"; # 防止谷歌服务暴露站点,同时也可以加快网站加载 sub_filter "www.google" "block_google"; sub_filter_once off; sub_filter_types *; } }
Code language: PHP (php)

详解

  • server_name 与 set
    使用正则表达式匹配以方便直接提取出我们要反代的二级域名
  • resolver
    必要,指定域名解析所用 DNS,因为在后续proxy_pass中我们要反代的域名是由$domain决定,本身是不定的,Nginx 必须被指定 DNS 才能处理域名解析
  • proxy_cookie_domain
    改变反代后返回的 header 中 set-cookie 里 cookie 对应的域名,只在*.example.com中需要,是解决登陆问题的关键,如想了解后续文章会解释
  • proxy_set_header Referer
    设置 header 中的 Referer,主要目的是解决i.pximg.net的防盗链问题,以及www.pixiv.net的部分 API 的 Referer 验证问题
  • proxy_set_header Accept-Encoding
    将接受的压缩编码设为空,即不接受压缩,因为sub_filter无法对压缩过的内容起效
  • sub_filter
    将反代后得到的内容进行字符串替换,以保证链接域名等与反代域名一致
  • sub_filter_types
    必须设置为*,否则默认对于 API 返回的 json 内容等不会进行替换,会导致依靠 ajax 运作的一些功能的异常

防止被搜索引擎收录

在 Nginx 配置中向每个 server 添加此句

if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot|^$") { return 403; }
Code language: PHP (php)

套 Cloudflare

备选域名

www.pixiv.net accounts.pixiv.net source.pixiv.net imp.pixiv.net i.pximg.net s.pximg.net pixiv.pximg.net
Code language: CSS (css)

分类: NGINX

1 条评论

repostone · 2019年9月30日 下午3:06

非技术的路过。

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据