如何在 nginx 的重写规则中使用自定义变量作为方案

如何在 nginx 的重写规则中使用自定义变量作为方案

有没有办法让 nginx 将自定义变量视为与重写规则中的 $scheme 相同?例如:

rewrite ^/redirect http://example.com;
# and
rewrite ^/redirect_with_scheme $scheme://example.com;

都会导致向客户端发送 302 重定向。但是,以下情况:

set $real_scheme $scheme;
rewrite ^/redirect_with_real_scheme $real_scheme://example.com;

将导致服务器端重写一个不一定存在的文件,然后客户端会收到 404 错误。以下代码值得一提:

set $real_scheme $scheme;
rewrite ^/redirect_with_real_scheme $real_scheme://example.com redirect;

将产生向客户端发送 302 的预期结果。不幸的是,我以这种方式设置了很多重定向,redirect如果没有必要,我宁愿不使用该指令更新所有重定向。

如果有帮助的话,我正在使用 Nginx 1.6.2。

答案1

文档状态:

如果替换字符串以“ http://”、“ https://”或“ $scheme”开头,则处理停止并且重定向返回给客户端。

如果您以其他变量开头 URL,则需要redirect明确表达意图。

答案2

我无法重现您的问题。

我尝试了以下最小配置,一切都rewrite按预期工作(HTTP 302s):

events {
    worker_connections  1024;
}


http {
    include mime.types;
    server {
        listen       80;

        set $real_scheme $scheme;
        rewrite ^/redirect http://localhost;
        rewrite ^/redirect_with_scheme $scheme://localhost;
        rewrite ^/redirect_with_real_scheme $real_scheme://localhost;
    }
}

您能否为我提供一个能够演示错误rewrite规则的最小配置?

相关内容