跳转至

server-redirect: 在同一请求中重定向服务器名称

安装

您可以在任何基于 RHEL 的发行版中安装此模块,包括但不限于:

  • RedHat Enterprise Linux 7、8、9 和 10
  • CentOS 7、8、9
  • AlmaLinux 8、9
  • Rocky Linux 8、9
  • Amazon Linux 2 和 Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-server-redirect
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-server-redirect

通过在 /etc/nginx/nginx.conf 的顶部添加以下内容来启用该模块:

load_module modules/ngx_http_server_redirect_module.so;

本文档描述了 nginx-module-server-redirect v0.1.2,于 2026 年 1 月 06 日发布。


描述

ngx_http_server_redirect_module 是一个自定义的 nginx 模块,旨在根据可配置规则促进动态服务器重定向。它允许用户有条件地将传入请求重定向到不同的服务器。

概述

基本重定向

无条件地将所有请求重定向到 newserver.com

http {
    server {
        listen 80;
        server_name example.com;

        server_redirect newserver.com;

        location / {
            proxy_pass http://newserver.com;
        }
    }

    server {
        listen 80;
        server_name newserver.com;

        # 您可以从此变量中获取原始主机。
        add_header x-original-host $server_redirect_original_host;

        location / {
            proxy_pass http://upstream.com;
        }
    }
}

条件重定向

根据特定头的存在重定向请求。

http {
    server {
        listen 80;
        server_name example.com;

        # 如果请求具有 'X-Redirect' 头且值不为 0 或为空,则重定向。
        server_redirect newserver.com if=$http_x_redirect;

        # 您可以使用 ngx_http_var_module 根据条件生成判断变量。
        # https://git.hanada.info/hanada/ngx_http_var_module
        # var $is_ipv6 if_find $remote_addr :;
        # server_redirect newserver.com if=$is_ipv6;

        # 此模块在 real_ip 模块之后生效,
        # 因此,real_ip 模块的指令将在服务器重定向之前生效。
        # real_ip_header x-client-ip;

        location / {
            proxy_pass http://newserver.com;
        }
    }

    server {
        listen 80;
        server_name newserver.com;

        # 您可以从此变量中获取原始主机。
        add_header x-original-host $server_redirect_original_host;

        location / {
            proxy_pass http://upstream.com;
        }
    }
}

调度重定向

将当前请求从第一个请求路径重定向到另一个服务器。 如果请求为 http://example.com/newserver.com/test?arg=1,则将重定向到 http:///newserver.com/test?arg=1。此过程是内部的,不会发生 302 重定向。

http {
    server {
        listen 80;
        server_name example.com;

        # 启用调度重定向。
        schedule_redirect on;

        # 请求不会到达这里,除非请求路径中的第一个路径不存在或第一个路径中的主机无效。
        return 400 "请求路径无效";
    }

    server {
        listen 80;
        server_name newserver.com;

        # 您可以从此变量中获取原始主机。
        add_header x-original-host $server_redirect_original_host;

        location / {
            proxy_pass http://upstream.com;
        }
    }
}

配置

指令: server_redirect

语法: server_redirect target_host [if=condition]

默认值: -

上下文: server

将当前请求重定向到另一个服务器。目标服务器必须与当前服务器具有相同的监听端口。

目标主机应为特定的主机名,就像请求头中的主机一样。即使您要重定向到的目标服务器是通配符域名或正则表达式。

如果找不到目标服务器,将重定向到默认服务器。

if 参数启用条件重定向。如果条件评估为“0”或空字符串,则请求将不会被重定向。此外,您还可以使用 if!= 的形式进行负判断。

以下是一个示例:

server_redirect newserver.com if=$http_server_redirect;

此示例在 Server-Redirect 头具有值且值不为 0 时将请求重定向到 newserver.com

指令: schedule_redirect

语法: schedule_redirect on | off

默认值: schedule_redirect off

上下文: server

将当前请求从第一个请求路径重定向到另一个服务器。

如果启用,当访问 http://a.com/b.com/ 时,请求将重定向到 http://b.com/。如果找不到目标服务器,将重定向到默认服务器。

当 server_redirect 指令存在并满足重定向条件时,将首先执行 server_redirect。

如果请求路径没有第一个路径(例如主页),则不会进行重定向。

重定向后,即使 $request_uri 也会清除第一个路径。您只能在请求行变量 $request 中找到原始请求路径。

变量: $server_redirect_original_host

在重定向发生之前,保留变量 $host 的原始值。

GitHub

您可以在 nginx-module-server-redirect 的 GitHub 仓库 中找到此模块的其他配置提示和文档。