Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nginx 使用Flask重定向在浏览器中保留URL_Nginx_Heroku_Flask_Bokeh_Nginx Config - Fatal编程技术网

Nginx 使用Flask重定向在浏览器中保留URL

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_

我在Heroku上部署了一个Bokeh服务器应用程序,它有多种样式,导致了繁琐的URL。例如:

我正在使用部署在Heroku上的Flask从一个简单的自定义域()获取扩展,并重定向到第二个Heroku应用程序,该应用程序运行Bokeh服务器并返回html内容。相关烧瓶应用程序代码:

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