0%

Nginx 反向代理中内容替换

本文介绍了如何使用 Nginx 反向代理谷歌服务,并且替换其中的内容。

我对谷歌字体进行了反代操作,具体见这篇文章:Nginx 反向代理 Google Font、Ajax 和 Gravatar 头像

这儿记一下研究过程中碰到的问题。

Nginx 反向代理配置文件参考

在 Nginx 文件夹下创建 conf 文件,用于反代。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

server {
...
resolver 8.8.8.8;

location /css {
sub_filter 'fonts.gstatic.com' 'fonts.itnote.me';
sub_filter_once off;
sub_filter_types *;
proxy_pass $scheme://fonts.googleapis.com:$server_port;
proxy_set_header Host fonts.googleapis.com;
proxy_set_header Accept-Encoding '';
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
client_max_body_size 1m;
proxy_cache_key $scheme$host$request_uri;
proxy_cache proxy_cache_zone_of_site_fonts.itnote.me;
proxy_cache_valid 200 301 302 7d;
proxy_cache_valid any 7d;
proxy_cache_min_uses 1;
proxy_cache_methods GET HEAD;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
proxy_cache_revalidate on;
proxy_cache_lock on;
proxy_cache_lock_timeout 6s;
}
...
}

遇见的问题

页面 502 错误

检查一下是不是缺少 resolver 配置参数

1
resolver 8.8.8.8;

检查 proxy_pass 代理地址参数是否正确

1
proxy_pass $scheme://fonts.googleapis.com:$server_port;

服务器访问 fonts.googleapis.com 会请求 resolver 中配置的 dns,才能请求到资源。

字符串替换无效

检查 sub_filter 是否正确

1
2
3
sub_filter 'fonts.gstatic.com' 'fonts.itnote.me';
sub_filter_once off;
sub_filter_types *;

上面配置的意思是将内容中的 fonts.gstatic.com 替换为 fonts.itnote.me

注意一下其中的 sub_filter_types 需要为 * 代表任何类型资源。

还要检查 proxy_set_header 参数是否正确

1
proxy_set_header Accept-Encoding '';

这个设置了代理资源请求头,当请求谷歌 css 文件的时候,它可能会进行一次 gzip 压缩,这个会导致字符串替换无效。