我正在尝试http://foo.mydomain.xyz/one/two/three.json
通过调用来获取http://bar.mydomain.xyz/cat/one/two/three.json
。我正在使用以下配置:
server {
listen 80;
listen [::]:80;
server_name bar.mydomain.xyz;
absolute_redirect off;
location / {
proxy_pass http://localhost:8080;
}
location /cat {
rewrite ^(/cat) http://foo.mydomain.xyz$request_uri permanent;
}
}
server {
listen 80;
listen [::]:80;
server_name foo.mydomain.xyz;
location / {
proxy_pass http://localhost:7070;
}
}
当我拨打电话时使用此配置:http://bar.mydomain.xyz/cat/
它将我http://foo.mydomain.xyz/
成功重定向到。但是当我拨打电话时,http://bar.mydomain.xyz/cat/one/two/three.json
它返回http://foo.mydomain.xyz/cat/one/two/three.json
。注意/猫不会从 URL 中删除。我该如何解决这个问题?
答案1
您的rewrite
语句只是更改了域名,没有其他内容。的值$request_uri
是原始 URI,包括前导/cat
部分。您需要在正则表达式中捕获 URI 的后半部分。
例如:
rewrite ^/cat/(.*)$ http://foo.example.com/$1 permanent;
或者可能:
rewrite ^/cat(?:/(.*))?$ http://foo.example.com/$1 permanent;
答案2
另一种方法是捕获指令中的部分location
:
location / {
proxy_pass http://localhost:8080;
}
location ~ ^/cat(/.+)$ {
return 301 http://foo.example.com$1$is_args$args;
}