我在Heroku上部署了一个Bokeh服务器应用程序,其中包含多种样式,导致网址繁琐。例如: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被设置为我的Heroku应用程序的自定义域(使用Heroku提供的DNS目标),该应用程序运行nginx + gunicorn + Flask(这是一个可用于查看当前行为的工作链接)。这个Heroku应用程序的基础URL是https://snowpacktracker.herokuapp.com。
当第一个Heroku应用程序收到请求时,Flask应用程序会重定向到运行Bokeh服务器的第二个Heroku应用程序。如当前实现的那样,您可以在浏览器中看到https://invlabs-bokehserver.herokuapp.com/avyview?style=snowpacktracker的URL开关。
www.snowpacktracker.com和www.snowpacktracker.com/btac都重定向到相同的URL。我有第二种用www.snowpacktracker.com/btac/historic定义的样式,重定向到https://invlabs-bokehserver.herokuapp.com/avyview。
我的目标是将页面加载www.snowpacktracker.com(以及任何扩展名:/ btac或/ btac / historical)通过Flask重定向,如当前实现的那样,但原始URL保持不变。
我一直试图根据@Fian的答案中的链接编辑location
配置文件中的nginx.conf.erb
块,但我没有运气。
在proxy_pass
区块中proxy_redirect
或rewrite
(或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;
}
}
}
我认为你的“相关烧瓶代码”看起来有点多余,因为整个过程可以很容易地在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的愿望。
我认为你误解了http://nginx.org/r/proxy_redirect的作用。很明显,你试图将它设置为off
,试图避免面向用户的重定向,例如,301
和302 Moved
,被回馈给用户,揭示内部域名,但这恰恰与该指令确实 - 最好将它保留为默认值。
如果您希望URL保持不变,只需使用http://nginx.org/r/proxy_pass。