我在 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 中是否有执行此操作的选项?或者我可以配置网络服务器来完成这个吗?
更新和更多细节:
我无法让 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.com和www.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_redirect
(或rewrite
?)的正确语句是什么location
来完成这种期望的行为?
我当前的 nginx 配置文件(在Heroku nginx 构建包中提供):
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;
}
}
}