V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
ghy459
V2EX  ›  NGINX

请教一个 nginx 反代 google 的问题

  •  1
     
  •   ghy459 ·
    ghy459 · 2014-10-26 14:16:59 +08:00 · 8049 次点击
    这是一个创建于 3688 天前的主题,其中的信息可能已经有所发展或是发生改变。
    先贴配置:

    server
    {
    listen 443;
    server_name g4w.me;

    ssl_certificate /root/ssl/g4w.me.crt;
    ssl_certificate_key /root/ssl/g4w.me.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-RC4-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:RC4-SHA:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!DSS:!PKS;
    ssl_prefer_server_ciphers on;

    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 5m;

    location / {
    subs_filter www.google.com g4w.me;
    subs_filter ssl.gstatic.com www.g4w.me;
    subs_filter_types text/css text/xml text/javascript;

    proxy_redirect off;
    proxy_pass https://www.google.com;
    proxy_set_header Host www.google.com;
    proxy_set_header User-Agent $http_user_agent;
    proxy_set_header Accept-Encoding '';
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    }

    使用 ngx_http_substitutions_filter_module 模块对页面内容进行替换,但发现只有 www.google.com 能够成功替换,而 ssl.gstatic.com 一直替换不了。请问这是什么原因?

    具体可以访问 https://g4w.me 看看。

    PS.已经试过 ngx_http_sub_module 和 replace-filter-nginx-module ,都是 www.google.com 起作用了而 ssl.gstatic.com 不起作用。
    32 条回复    2014-11-23 16:22:39 +08:00
    anjunecha
        1
    anjunecha  
       2014-10-26 14:39:10 +08:00 via Android
    把两个域名分开反代,你试试另建一个新的 conf 文件,专门用来反代 ssl.gstatic.com, server_name 填为 www.g4w.me
    ghy459
        2
    ghy459  
    OP
       2014-10-26 14:46:06 +08:00
    @anjunecha 这一步已经做好了。

    现在的问题是,g4w.me 里面的 ssl.gstatic.com 不会自动替换成 www.g4w.me ,而是仍然访问原地址。
    anjunecha
        3
    anjunecha  
       2014-10-26 15:07:20 +08:00 via Android   ❤️ 2
    @ghy459 我明白你的问题出在哪里了,但是我现在暂时在外面,手机上贴代码不方便,等我一会儿回家之后给你贴代码,稍等我一下可以吗?😄
    ghy459
        4
    ghy459  
    OP
       2014-10-26 15:20:21 +08:00
    @anjunecha 没关系,先谢了~
    anjunecha
        5
    anjunecha  
       2014-10-26 16:07:36 +08:00
    @ghy459 你试试在你刚刚建的第二个 conf 文件里面使用这样的设置,使用下面的代码

    server
    {
    listen 443 ssl;
    server_name www.g4w.me;

    ssl_certificate /root/ssl/g4w.me.crt;
    ssl_certificate_key /root/ssl/g4w.me.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-RC4-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:RC4-SHA:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!DSS:!PKS;
    ssl_prefer_server_ciphers on;

    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 5m;

    location / {
    subs_filter www.google.com g4w.me;
    subs_filter ssl.gstatic.com www.g4w.me;
    subs_filter_types text/css text/xml text/javascript;

    proxy_set_header Accept-Encoding "";
    proxy_set_header Accept-Langauge "zh-CN";

    proxy_pass https://ssl.gstatic.com/;

    # cookie domain replace
    proxy_cookie_domain ssl.gstatic.com www.g4w.me;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    }
    ghy459
        6
    ghy459  
    OP
       2014-10-26 16:50:53 +08:00
    @anjunecha 我的 www.g4w.me 配置跟你写的基本一样了。

    其实现在的问题不在 www.g4w.me 的反代上,而是 g4w.me 里面的

    subs_filter ssl.gstatic.com www.g4w.me;

    这句话不起作用,导致在访问 g4w.me 的时候仍然向 ssl.gstatic.com 发送请求而不是向 www.g4w.me 发送。



    要达到的效果是下面红线的 ssl.gstatic.com 替换成 www.g4w.me
    fairytale
        7
    fairytale  
       2014-10-26 17:51:51 +08:00
    复杂点的替换,用代码实现吧,比如knproxy
    spance
        8
    spance  
       2014-10-26 17:56:50 +08:00   ❤️ 5
    想要完美一点,就不要折腾subs_filter了。
    好用的方案在这里 https://github.com/spance/AirGoo
    hzqim
        9
    hzqim  
       2014-10-26 18:35:57 +08:00
    域名反代不了,就反代IP.
    yingluck
        10
    yingluck  
       2014-10-26 20:51:51 +08:00   ❤️ 1
    试试subs_filter ‘//ssl.gstatic.com’,加上双引号

    其实这个只是个图片,不影响搜索
    rentaro
        11
    rentaro  
       2014-10-26 21:12:29 +08:00
    我也用 subs_filter,只有这一个资源不知为何无法反代 https://www.google.com/textinputassistant/tia.png
    ghy459
        12
    ghy459  
    OP
       2014-10-26 21:33:13 +08:00
    @rentaro 加上这一行就好了
    subs_filter www.google.com xxx.me;
    ghy459
        13
    ghy459  
    OP
       2014-10-26 21:37:18 +08:00
    @yingluck 加了双引号还是不行。这个 load 不出来的话标签那里就一直转,强迫症要犯了=。=
    ghy459
        14
    ghy459  
    OP
       2014-10-26 21:37:39 +08:00
    @spance 好像很强大的样子,晚点试试
    rentaro
        15
    rentaro  
       2014-10-26 21:47:51 +08:00
    @ghy459 这句是加了的,我是说除了这一个资源其他都反代成功
    ghy459
        16
    ghy459  
    OP
       2014-10-26 21:58:40 +08:00
    @rentaro 额,我就是加了这个,然后成功反代你说的资源。。。
    anjunecha
        17
    anjunecha  
       2014-10-26 22:23:53 +08:00
    @ghy459 不能实现?可以试试通过反代 IP ,把之前我贴的那个配置里面的 proxy_pass 参数改一下试试

    具体改为 :

    proxy_pass https://ssl.gstatic.com/;

    改为

    proxy_pass http://173.194.38.127;
    rentaro
        18
    rentaro  
       2014-10-26 22:30:29 +08:00   ❤️ 1
    ssl.gstatic.com 这个,我是用 subs_filter 替换为一个子目录,比如 www.g4w.me/gstc。然后
    用这个子目录去反代资源
    rentaro
        19
    rentaro  
       2014-10-26 22:31:55 +08:00
    呃,描述有误,目录的叫法不对
    anjunecha
        20
    anjunecha  
       2014-10-26 22:44:17 +08:00 via Android   ❤️ 1
    @rentaro 可能表述为路径更妥当😊
    ghy459
        21
    ghy459  
    OP
       2014-10-26 23:00:43 +08:00
    @anjunecha 谢谢你的帮忙哈,不过我暂时放弃了,明天还要上班=。=
    现在用了@spance 提供的 https://github.com/spance/AirGoo ,配置简单,先凑合着用。。
    ghy459
        22
    ghy459  
    OP
       2014-10-26 23:01:05 +08:00
    @rentaro 嗯,有空我再去试试,先谢了
    rentaro
        23
    rentaro  
       2014-10-26 23:17:30 +08:00
    @anjunecha 借地请教,11楼中我的反代小问题,配置和之前 /t/126028 类似,先行谢过
    anjunecha
        24
    anjunecha  
       2014-10-27 07:37:16 +08:00   ❤️ 1
    @rentaro 之前的那篇帖子就是我写的,很多时候如果反代域名不行的话可以试试通过反代 IP 的形式,
    ryd994
        25
    ryd994  
       2014-10-27 18:45:43 +08:00 via Android   ❤️ 1
    sub_filter对gzip内容无效,你试试改accept-encoding
    ryd994
        26
    ryd994  
       2014-10-29 15:14:52 +08:00 via Android
    @anjunecha 反带域名不行是没有upstream,
    加一个resolver 就好
    imxz
        27
    imxz  
       2014-10-30 00:56:46 +08:00
    @spance

    您好,请问如果想要反代谷歌学术的话,是否只需要修改airgoo.js中的hostname为 scholar.google.com 即可? 此外,如果为了用户访问不加https的网址时能跳转到https,在nginx中配置了301重定向,还能否正确发送x-forwarded头,以及ip、cookie等信息 ?

    谢谢 !
    spance
        28
    spance  
       2014-10-30 17:44:55 +08:00
    @imxz
    改hostname是可以的,只是没有对scholar作专门测试,可能会有部分请求漏网。
    301不影响。
    https server部分按照wiki配好就ok了。
    imxz
        29
    imxz  
       2014-10-30 20:10:21 +08:00   ❤️ 1
    @spance

    谢谢回复。

    我测试了一下,没用域名,直接ip访问的时候,直接改hostname为scholar.google.com好像不行,他会跳转到一个类似 xxx.xxx.xxx.xxx.nord (记忆中)的地址
    spance
        30
    spance  
       2014-10-30 20:53:14 +08:00   ❤️ 2
    @imxz
    google的js会去监测当前域的,而且很多地方用了大量的绝对地址和js拼接地址,如果没有处理干净,漏网的请求就能把页面重定向了。
    而且google得js经常升级变化,如果你的确需要scholar.google.com那最好分析一下跳转,然后把处理规则写到defines.js中,我可能没有精力去弄scholar了,维护一个项目都挺累的,毕竟业余时间也很有限啊。
    imxz
        31
    imxz  
       2014-10-30 21:41:43 +08:00
    @spance 好的,谢谢你!
    popphen
        32
    popphen  
       2014-11-23 16:22:39 +08:00
    @spance 哥们谢谢你,一下实现了我的想法
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   964 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:06 · PVG 04:06 · LAX 12:06 · JFK 15:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.