nginx proxy_pass 将端口号添加到 URL

nginx proxy_pass 将端口号添加到 URL

我在 Heroku 上部署了一个标准 Rails 应用。我使用自定义构建包来安装 nginx,这样我就可以创建一些重写规则和反向代理。除了一个问题外,它基本都正常工作。

我有以下location定义来将所有以 /blog/ 开头的 URL 代理传递到另一个应用程序。

location ~* ^/blog/?(.*) {
  set $forward_host       'another.app.com';
  set $url_full           '$1';

  resolver                8.8.8.8 valid=300s;
  resolver_timeout        10s;

  # always add trailing slash
  rewrite ^([^.]*[^/])$   $1/ permanent;

  index index.html;

  proxy_hide_header       Set-Cookie;
  proxy_set_header        X-Real-IP $remote_addr;
  proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header        X-Scheme $scheme;
  proxy_set_header        Host $forward_host;
  proxy_ignore_headers    "Set-Cookie";
  proxy_buffering         off;
  proxy_intercept_errors  on;
  proxy_redirect          off;
  proxy_pass              http://$forward_host/$url_full;
}

我希望所有 URL 都以斜杠结尾,这就是我添加的原因:

rewrite ^([^.]*[^/])$   $1/ permanent;

当我点击时一切正常:

http://nginx-playground.herokuapp.com/blog/

但是当我没有尾随斜杠并且重写规则开始时,proxy_pass 会将内部 Heroku PORT 号添加到 url,它看起来像这样:

http://nginx-playground.herokuapp.com:27348/blog/

我尝试了很多不同的方法,比如设置 proxy_redirect,但还是没能解决问题。

这是我设置的示例应用程序的 github 项目的链接。您可以 fork/clone 它并尝试部署到 heroku 以亲自查看会发生什么。

https://github.com/WeConnect/nginx-playground

如果你这样做,你将需要以下 ENV 变量:

BUILDPACK_URL: https://github.com/ddollar/heroku-buildpack-multi.git
LANG:          en_US.UTF-8
RACK_ENV:      production

这是我用作起点的博客文章: http://blog.codeship.com/how-to-deploy-nginx-on-heroku/

如能得到任何帮助或线索我将非常感激。

相关内容