Nginx代理并内容替换

必须说,Nginx太强大了

今天又一个需求,把一个http服务,变成https服务,很容易想到Nginx的反向代理,但是配置好发现,网页是乱码,且出现了很多404错误。

打开浏览器的开发工具,发现404的请求都是走原来的链接,没有走新的https地址。

再进一步分析,是因为http服务中,有一些text/htmltext/css中,有原http地址。这怎么处理?

查询了一下,发现Nginx已经有这个功能了—ngx_http_sub_module

主要指令

  • sub_filter

sub_filter old new
用于设置需要使用说明字符串替换

  • sub_filter_last_modified

sub_filter_last_modified on | off

  • sub_filter_once

sub_filter_once on | off;
用于设置字符串替换次数,默认只替换一次。如果是off,那么所有匹配到的字符都会被替换;

  • sub_filter_types

sub_filter_types
用于指定需要被替换的MIME类型,默认为“text/html”,如果制定为
,则为所有的。

参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server {
listen 443;
server_name example.501joy.net;
ssl on;
root html;
index index.html index.htm;
ssl_certificate ssl/1_example.501joy.net_bundle.crt;
ssl_certificate_key ssl/2_example.501joy.net.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;

location / {
proxy_pass http://example.501joy.cn/;
# 反向代理规则
proxy_set_header Accept-Encoding deflate;
sub_filter 'http://example.501joy.cn' 'https://example.501joy.net';
sub_filter_types text/html text/css;
sub_filter_once off;
}
}