Nginx 使用Flask重定向在浏览器中保留URL
我在Heroku上部署了一个Bokeh服务器应用程序,它有多种样式,导致了繁琐的URL。例如: 我正在使用部署在Heroku上的Flask从一个简单的自定义域()获取扩展,并重定向到第二个Heroku应用程序,该应用程序运行Bokeh服务器并返回html内容。相关烧瓶应用程序代码:Nginx 使用Flask重定向在浏览器中保留URL,nginx,heroku,flask,bokeh,nginx-config,Nginx,Heroku,Flask,Bokeh,Nginx Config,我在Heroku上部署了一个Bokeh服务器应用程序,它有多种样式,导致了繁琐的URL。例如: 我正在使用部署在Heroku上的Flask从一个简单的自定义域()获取扩展,并重定向到第二个Heroku应用程序,该应用程序运行Bokeh服务器并返回html内容。相关烧瓶应用程序代码: from flask import Flask, redirect app = Flask(__name__) @app.route('/') def index(): return redirect(url_
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()
我希望在烧瓶重定向发生时,原始URL保持不变。烧瓶内是否有这样做的选项?或者我可以配置web服务器来实现这一点吗
更新和更多详细信息:
我无法使nginx代理正常工作。我目前的情况:
设置为运行nginx+gunicorn+Flask的my Heroku应用程序的自定义域(使用Heroku提供的DNS目标)(这是一个可用于查看当前行为的工作链接)。此Heroku应用程序的基础URL为
当第一个Heroku应用程序收到请求时,Flask应用程序重定向到运行Bokeh服务器的第二个Heroku应用程序。按照当前的实现方式,您可以在浏览器中看到URL切换到
并重定向到同一URL。我定义了第二种样式,它重定向到
我的目标是通过Flask重定向当前实现的页面加载(以及任何扩展:/btac或/btac/historic),但原始URL保持不变。
我一直在试图根据@Fian的答案中的链接编辑
nginx.conf.erb
config文件中的location
块,但我运气不好
在位置
块中,代理传递
或代理重定向
(或重写
?)的正确语句是什么,以实现此所需行为
我当前的nginx配置文件(在中提供):
守护进程关闭;
#Heroku dynos至少有4个磁芯。
工人的工作流程;
事件{
使用epoll;
接受上的互斥;
工人(1024);;
}
http{
gzip on;
gzip_comp_二级;
gzip_最小长度512;
服务器_令牌关闭;
log_format l2met'measure#nginx.service=$request_time request_id=$http_x_request_id';
access_log logs/nginx/access.log l2met;
错误日志/nginx/error.log;
包括mime.types;
默认_类型应用程序/八位字节流;
发送文件到;
#必须在5秒内读取正文。
客户端\主体\超时5;
上游应用程序服务器{
服务器unix:/tmp/nginx.socket失败\u超时=0;
}
服务器{
听
服务器名称;
保持激活超时5;
地点/{
proxy\u set\u header X-Forwarded-For$proxy\u add\u X\u Forwarded\u For;
代理设置头主机$http\U主机;
代理_重定向关闭;
代理通行证http://app_server;
}
}
}
您想要的称为代理,可以通过或来实现
另外,您的整个问题似乎很奇怪,请修改您的整个体系结构。您需要的是代理,可以通过或来实现
另外,您的整个问题似乎很奇怪,请修改您的整个架构。我认为您误解了它的作用。很明显,您正试图将其设置为
off
,以避免面向用户的重定向(例如,301
和302-Moved
)返回给用户,显示内部域名,但这与指令的作用正好相反-几乎总是最好将其保留为默认值
如果您希望URL保持不变,只需使用。我想您误解了它的作用。很明显,您正试图将其设置为
off
,以避免面向用户的重定向(例如,301
和302-Moved
)返回给用户,显示内部域名,但这与指令的作用正好相反-几乎总是最好将其保留为默认值
如果您希望URL保持不变,只需使用。我认为您的“相关flask代码”看起来有点多余,因为整个过程可以轻松地在nginx中单独实现,而不需要您提供的flask代码
类似的方法可能会奏效:
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-手机“;
);这显然会干扰您“隐藏”应用程序的底层URL的愿望。我认为您的“相关flask代码”看起来有点多余,因为整个过程可以轻松地在nginx中单独实现,而不需要您提供的flask代码
类似的方法可能会奏效:
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-手机“;
);这显然会干扰您“隐藏”应用程序的底层URL的愿望。谢谢,我将查看代理。我正在Heroku上使用nginx+gunicorn。是的,这实际上是一个临时解决方案,利用了我们已经编写的大量代码。虽然我们的架构可能需要一个大的修改,但时间和资金都不够。我一直在尝试编辑nginx配置文件,但没有取得任何进展。我在我的配置文件中发布了一个更新和更多关于默认位置的详细信息。谢谢,我将查看代理。我正在Heroku上使用nginx+gunicorn。是的,这实际上是一个临时解决方案,leveragi