Я пытаюсь позвонить 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;
}