/ nginx / Docker / SAE

用nginx镜像远程站点并替换HTML

Nginx可以做很多事,除了我们最常用的做Web服务器和反向代理,它其实还可以让我们做很多的“小动作”,比如本文要介绍的镜像一个站点、替换HTTP的响应内容。

来,容我先描述一下需求: devylee.github.io是我的Github Page;devylee.me是我的一个域名,而且经过一系列的波折,在新浪云终于通过了工信部的备案,可以在国内用了。so,那就不要让这个域名闲着了,但我又并不想直接把这域名绑定在我的Github Page上(GH上只能绑定一个独立域名,而且不支持HTTPS),所以,我就用SAE部署一个Docker容器并绑定devylee.me这个域名,然后用Nginx把请求都proxy到devylee.github.io,顺便在返回的HTML页面中注入备案号。

需求很简单吧,来,让我们撸起袖子干吧!

首先上Dockerfile(SAE上如何部署Dockerfile可以参考我之前的文章“用SAE Docker一个Ghost博客”):

我这里监听的端口是5050,这个要看你的SAE应用中环境变量PORT的具体值。

FROM nginx:alpine

COPY nginx-default.conf /etc/nginx/conf.d/default.conf

EXPOSE 5050

nginx-default.conf:

server {
    listen 5050;

    location / {
        proxy_pass http://devylee.github.io;
        proxy_redirect off;

        sub_filter 'All Rights Reserved.' 'All Rights Reserved. <a href="http://www.miitbeian.gov.cn">辽ICP备16011865号</a>';
    }

}

如此,push并确认成功后,在浏览器输入devylee.me,哦,没错,这就是我的Github Page!不过,备案号呢?貌似sub_filter并未起作用啊!

经过各种尝试(甚至是更换镜像源,从头编译nginx,然并卵!),最终找到原因原来是因为Accept-Encoding

怎么回事?因为现在几乎所有的Web服务器都支持gzip压缩的,也就是Accept-Encoding: gzip,而且默认情况下就是启用的,当然Github Page也不例外!于是乎,我们的Nginx 通过proxy_pass得到的响应内容其实是被gzip过的,所以,sub_filter就根本不起作用!找到问题所在,接下来就简单了,我们只要对nginx-default.conf稍加改造(增加一行proxy_set_header Accept-Encoding "")就可以了:

server {
    listen 5050;

    location / {
        proxy_pass http://devylee.github.io;
        proxy_redirect off;
        proxy_set_header Accept-Encoding "";

        sub_filter 'All Rights Reserved.' 'All Rights Reserved. <a href="http://www.miitbeian.gov.cn">辽ICP备16011865号</a>';
    }

}

OK!再次push,刷新浏览器~

嗯!有没有觉得so easy啊!


参考:

  1. Nginx ngx_http_sub_module Module
Devy

独立开发者' 全栈' 80前' 在理想与现实之间寻找平衡'

Read More