Nginx遵循重定向和反向代理的最后位置

时间:2017-02-03 09:44:07

标签: redirect nginx reverse-proxy

我试图反向代理内部有N重定向301的网址 我想关注所有页面,然后反向代理最后一页(4th-url.php)。

是否可以使用Nginx进行操作?

这是方案

第一个网址:

http://first-domain.com/first-url.php

重定向

http://first-domain.com/second-url.php

重定向

http://first-domain.com/third-url.php

重定向(最后一个)

http://first-domain.com/fourth-url.php

这是我迄今为止所做的文件配置:

server {

  set $base_url 'http://first-domain.com';
  set $page 'first-url.php'

  location /myserver {
     resolver 8.8.8.8;
     proxy_set_header X-Real-IP  $remote_addr;
     proxy_set_header X-Forwarded-For $remote_addr;
     proxy_set_header Host $host;
     proxy_pass $base_url/$page;
     proxy_intercept_errors on;
     error_page 301 302 307 = @handle_redirect;
  }

  location @handle_redirect {
     resolver 8.8.8.8;
     set $saved_redirect_location $upstream_http_location;
     proxy_set_header X-Real-IP  $remote_addr;
     proxy_set_header X-Forwarded-For $remote_addr;
     proxy_set_header Host $host;
     proxy_pass $base_url/$saved_redirect_location;
     proxy_intercept_errors on;
     error_page 301 302 307 = @handle_redirect;
  }
}

这应该作为递归函数,但也许我错过了if语句或最后一部分。

实际上它的工作原理如下:

http://first-domain.com/first-url.php [确定]
http://first-domain.com/second-url.php [确定]

然后nginx停止一切并返回:

HTTP request sent, awaiting response... 302 Moved Temporarily
Location: unspecified
ERROR: Redirection (302) without location.

旁注:first-url.php,second-url.php等...只包含一行简单的代码来进行重定向:

header("Location: second-url.php");

赞赏任何提示/想法。

1 个答案:

答案 0 :(得分:0)

解决方案:添加recursive_error_pages指令。

server {
...
proxy_intercept_errors on;
recursive_error_pages on;
error_page 301 302 303 307 308 = @handle_redirect;
...
}

此外,根据nginx recursion limited,由于nginx将递归限制设置为10,因此您不必担心循环重定向问题。