Skip to content
MiTu

MiTu

A Web developer who loves to Reading and photography

Nginx 的 sub_filter 使用

sub_filter 是 Nginx 的一个模块,用于在响应内容中替换字符串。它通常用于修改 HTML、CSS 或 JavaScript 文件中的内容。以下是 sub_filter 的基本用法和配置示例。

1. 确保 Nginx 已启用 ngx_http_sub_module

sub_filterngx_http_sub_module 模块提供的功能。大多数 Nginx 安装默认包含此模块,但如果你不确定,可以通过以下命令检查:

bash
nginx -V 2>&1 | grep -- '--with-http_sub_module'

如果输出中包含 --with-http_sub_module,则表示已启用。

2. 基本语法

sub_filter 的基本语法如下:

nginx
sub_filter <要替换的字符串> <替换后的字符串>;

3. 配置示例

假设你想将响应内容中的 foo 替换为 bar,可以在 Nginx 配置文件中添加以下内容:

nginx
server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_server;

        # 启用 sub_filter
        sub_filter 'foo' 'bar';
        sub_filter_once off;  # 默认只替换一次,设置为 off 以替换所有匹配项
    }
}

4. 高级用法

  • 多次替换:默认情况下,sub_filter 只替换第一个匹配项。如果你想替换所有匹配项,可以设置 sub_filter_once off;

  • 多组替换:你可以使用多个 sub_filter 指令进行多组替换。

nginx
location / {
    proxy_pass http://backend_server;

    sub_filter 'foo' 'bar';
    sub_filter 'hello' 'world';
    sub_filter_once off;
}
  • 替换响应头sub_filter 只能替换响应体内容。如果你想替换响应头,可以使用 more_set_headers 模块(需要安装 ngx_http_headers_module)。

5. 注意事项

  • sub_filter 只能用于文本内容,不能用于二进制文件。
  • 如果响应内容经过压缩(如 gzip),sub_filter 将无法正常工作。你需要确保响应内容未压缩,或者在 Nginx 配置中禁用压缩。
nginx
location / {
    proxy_pass http://backend_server;
    proxy_set_header Accept-Encoding "";  # 禁用压缩
    sub_filter 'foo' 'bar';
    sub_filter_once off;
}

6. 完整示例

以下是一个完整的 Nginx 配置示例,展示了如何使用 sub_filter 替换响应内容中的多个字符串:

nginx
server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_server;
        proxy_set_header Accept-Encoding "";  # 禁用压缩

        # 启用 sub_filter
        sub_filter 'foo' 'bar';
        sub_filter 'hello' 'world';
        sub_filter_once off;  # 替换所有匹配项
    }
}

通过以上配置,Nginx 会在响应内容中将所有的 foo 替换为 bar,并将所有的 hello 替换为 world

7. 测试与验证

配置完成后,重新加载 Nginx 配置:

bash
sudo nginx -s reload

然后访问你的网站,检查响应内容是否按预期进行了替换。

总结

sub_filter 是一个强大的工具,可以在 Nginx 中轻松实现内容替换。通过合理配置,你可以灵活地修改响应内容,满足各种需求。