Nginx:重写并保留路径

Nginx:重写并保留路径

我想设置一个临时重定向到另一个域,但我想保持路径非常相似。

以下是一个例子:

请求 URL:https://api.mydomain.com/uploads/default/logo.png

重写的 URL 应为:https://cdn.mydomain.com/default/logo.png

我已经设置了这样的规则,但它不起作用:

{

    server api.mydomain.com

    location /uploads/(.*)$ {
           rewrite ^ $scheme://cdn.mydomain.com/$1 redirect;
    }

}

答案1

解释一下为什么您的重写解决方案不起作用。rewrite指令将其第一个参数视为正则表达式。您正在使用^正则表达式(一种匹配任何字符串的非常常见的方法),并且在正则表达式匹配$1变量之后具有空值,因为^正则表达式模式没有任何捕获组。因此,前一个$1变量值会丢失。相反,return指令不会将任何参数视为正则表达式,并且$1变量值不会改变。

如何才能防止$1变量值丢失?以下是另外两种可能的解决方案:

  • 使用命名捕获组location指令中:
    {
    
        server api.mydomain.com
    
        location /uploads/(?<suffix>.*) {
            rewrite ^ $scheme://cdn.mydomain.com/$suffix redirect;
        }
    
        ...
    
    }
    
  • 在上下文中使用rewrite指令,server而不是location一个:
    {
    
        server api.mydomain.com
    
        rewrite ^/uploads/(.*) $scheme://cdn.mydomain.com/$1 redirect;
    
        ...
    
    }
    

有时使用数字捕获组会导致很难追踪的错误,请参阅例如问题/答案。

答案2

找到解决办法了。

这很简单,我使用重定向解决了这个问题。(尽管使用重写无法使其工作)

这是更新后的配置:


 location ~ ^/uploads/(.*)$ {
           return 302 $scheme://cdn.mydomain.com/$1;
    }

答案3

要执行快速重定向而不是正则表达式匹配,我发现最简单的方法是使用以下配置:

    location / { # Redirect all with full path and request string
            return      302 http://cdn.mydomain.com$uri$is_args$args;
    }

这意味着,对该主机的所有请求将被完全重定向,包含完整路径和所有请求参数。

将代码设置为 301 以进行永久重定向。

相关内容