通过Flask重定向在浏览器中保留URL

时间:2018-09-04 17:52:03

标签: nginx heroku flask bokeh nginx-config

我在Heroku上部署了一个Bokeh服务器应用程序,它具有多种样式,导致URL繁琐。例如:https://invlabs-bokehserver.herokuapp.com/avyview?style=snowpacktracker

我正在使用部署在Heroku上的Flask从简单的自定义域(www.snowpacktracker.com)进行扩展,并重定向到运行Bokeh服务器并返回html内容的第二个Heroku应用。相关的Flask应用代码:

from flask import Flask, redirect

app = Flask(__name__)
@app.route('/')
def index():
  return redirect(url_for("btac"), code=302)

@app.route('/btac')
def func1():
  return redirect("https://invlabs-bokehserver.herokuapp.com/avyview?style=snowpacktracker", code=302)

@app.route('/btac/historic') 
def btac_historic():
  return redirect("https://invlabs-bokehserver.herokuapp.com/avyview", code=302)

if __name__ == '__main__':
  app.run()

在Flask重定向发生时,我希望原始URL保持不变。 Flask中是否可以选择执行此操作?还是可以配置Web服务器来完成此任务?

更新和更多详细信息:

我无法让Nginx代理正常工作。我目前的情况:

www.snowpacktracker.com已设置为我的运行nginx + gunicorn + Flask的Heroku应用程序的自定义域(使用Heroku提供的DNS目标)(这是一个有效的链接,您可以用来查看当前行为) 。此Heroku应用程序的基础URL为https://snowpacktracker.herokuapp.com

当第一个Heroku应用程序收到请求时,Flask应用程序将重定向到运行Bokeh服务器的第二个Heroku应用程序。按照当前的实现,您可以在浏览器中看到URL切换到https://invlabs-bokehserver.herokuapp.com/avyview?style=snowpacktracker

www.snowpacktracker.comwww.snowpacktracker.com/btac都重定向到相同的URL。我还有用www.snowpacktracker.com/btac/historic定义的第二种样式,该样式重定向到https://invlabs-bokehserver.herokuapp.com/avyview

我的目标是将www.snowpacktracker.com(以及所有扩展名:/ btac或/ btac / historic)的页面加载通过当前实施的Flask重定向,但原始URL保持不变。

我一直试图根据@Fian答案中的链接来编辑location配置文件中的nginx.conf.erb块,但是我没有运气。

proxy_pass块中,proxy_redirectrewrite(或location)的正确语句是什么?

我当前的nginx配置文件(在Heroku nginx build pack中提供):

daemon off;
#Heroku dynos have at least 4 cores.
worker_processes <%= ENV['NGINX_WORKERS'] || 4 %>;

events {
    use epoll;
    accept_mutex on;
    worker_connections 1024;
}

http {
        gzip on;
        gzip_comp_level 2;
        gzip_min_length 512;

    server_tokens off;

    log_format l2met 'measure#nginx.service=$request_time request_id=$http_x_request_id';
    access_log logs/nginx/access.log l2met;
    error_log logs/nginx/error.log;

    include mime.types;
    default_type application/octet-stream;
    sendfile on;

    #Must read the body in 5 seconds.
    client_body_timeout 5;

    upstream app_server {
        server unix:/tmp/nginx.socket fail_timeout=0;
    }

    server {
        listen <%= ENV["PORT"] %>;
        server_name _;
        keepalive_timeout 5;

        location / {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            proxy_pass http://app_server;
        }
    }
}

3 个答案:

答案 0 :(得分:1)

您想要的东西称为代理,可以通过nginxapache来实现。

P.S。您的整个问题似乎很奇怪,请修改您的整个体系结构。

答案 1 :(得分:1)

我认为您对http://nginx.org/r/proxy_redirect的做法有误解。显然,您正在尝试将其设置为off,以避免将面向用户的重定向(例如301302 Moved)发还给用户,这表明内部域名,但这与指令的作用恰好相反—几乎总是最好将其保留为默认值。

如果您希望URL保持不变,只需使用http://nginx.org/r/proxy_pass

答案 2 :(得分:1)

我认为您的“相关烧瓶代码”看起来有点多余,因为整个事情可以轻松地单独在nginx中实现,而无需您提供的烧瓶代码。

类似的事情可能会起作用:

server_name .snowpacktracker.com;
location = / {
    return 302 /btac;
}
location / {
    return 404;
}
location /static {
    proxy_pass http://invlabs-bokehserver.herokuapp.com;
}
location /avyview {
    proxy_pass http://invlabs-bokehserver.herokuapp.com;
}
location = /btac {
    proxy_pass http://invlabs-bokehserver.herokuapp.com/avyview?style=snowpacktracker;
}
location = /btac/historic {
    proxy_pass http://invlabs-bokehserver.herokuapp.com/avyview;
}

请注意,您的基础应用invlabs-bokehserver.herokuapp.com/avyview在几个实例中明确提到了其自己的完整URL,包括基于JavaScript的自动重定向到移动版本(即window.location = 'https://btac-web-plots.herokuapp.com/avyview?style=snowpacktracker-mobile';);这显然会干扰您“隐藏”应用程序底层URL的愿望。