技术解析

这个 proxy_redirect 是做什么的?
0
2021-05-20 20:36:54
idczone

我想弄一个反向代理到 HTTPS 的网站,弄好之后我发现: 1.反向代理到我们学校 BBS ,( HTTP 的)就没事 2.反代到 github 百度盘这种 https 的就有问题

access.log 报 301 记录, chrome 说 too many redirect

我不会抓包,网上也没类似的解美国服务器决方案(主要是 access.log 好像只记录我到代理服务器的内容,不记录代理服务器和 github 之间的内容?)

于是我就找了别人的正确的配置文件一行一行比较,发现有个: proxy_redirect off;

设置好了之后就可以访问 github 了,但是浏览器地址栏变成github了,相当于我直接访问,不是代理的意思了(我本身就能访问 github ),

配置文件如下:

http {

    server {
    listen  8080 default backlog=2048;
    listen  443 ssl;

    server_name  127.0.0.1;  

    ssl_certificate /etc/nginx/xxxxx.crt;
    ssl_certificate_key /etc/nginx/xxxx.key;

    location /proxy/git/ {   
        proxy_pass https://github.com/;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for; 
        proxy_pass_header Server;


        proxy_redirect off;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;

        }
        error_page   500 502 503 504  /50x.html;   
   }

    ##
    # Basic Settings
    ##

    sendfile on; 
    tcp_nopush on; 
    tcp_nodelay on; 
    keepalive_timeout 65; 
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64; 
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # Logging Settings
    ##

问题: 1.我成功失败的这些情况,到底是跟 301 重定向有关还是跟 http https 有关?(我了解一些 HTTP HTTPS 的内容和 HSTS )

2.为什么加了

proxy_redirect off;

就能好了?

3.所以到底如何才能在浏览器地址栏不变的情况下真正代理?

谁能简单说一下 浏览器 代理服务器 目的服务器的过程? 谢谢了!感激不尽!


@imlonghao

http://nginx.org/en/docs/http/ngx_http_proxy_module.htmlRTFM

upsteam 和 set 用一个。

可以麻烦您稍微说一下为什么它 301 发过来,我就开始直连了呢?好像反代失效了

这明显是由于给的 301 是完整网址

奇怪的很,我用抓包发现 http 头的 host 没有被替换,还是 127.0.0.1 ,估计这里出错了,可是我配置文件写了替换头的那句啊

呃, 反代 https 不是 只能降级成 http 么, 不明觉厉
-------
写 hosts (或者 dns 服务器的 hosts ) 把 github.com 劫持到反代上。

响应里面的 Location 啊,不是 host

proxy_set_header Host $http_host;
这个可能有问题,对方会不认的

结贴
proxy_set_header Host $http_host;
这句话把我和 nginx 通信的 HTTP 头原封不动的发给了 目的服务器
我以为这句话的意思是: Nginx 向目的服务器请求的时候替换成目的服务器的 Host ,实际没有
真正的做法是 proxy_set_header Host $proxy_host;
再次感谢帮助我的各位,也在这里存个档

学习一下

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服