我想设置一个临时重定向到另一个域,但我想保持路径非常相似。
以下是一个例子:
请求 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 以进行永久重定向。