使用 Flask 重定向在浏览器中保留 URL
Retain URL in browser with Flask redirect
我在 Heroku 上部署了一个 Bokeh 服务器应用程序,具有多种样式,导致 URLs 很麻烦。例如:https://invlabs-bokehserver.herokuapp.com/avyview?style=snowpacktracker
我正在使用部署在 Heroku 上的 Flask 从简单的自定义域 (www.snowpacktracker.com) 获取扩展并重定向到第二个运行 Bokeh 服务器和 returns html 内容。相关 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()
我希望原始 URL 在 Flask 重定向发生时保持不变。 Flask 中是否有执行此操作的选项?或者我可以配置网络服务器来完成这个吗?
更新和更多细节:
我无法使 nginx 代理正常工作。我的现状:
www.snowpacktracker.com 设置为我的 Heroku 应用程序的自定义域(使用 Heroku 提供的 DNS 目标)运行 nginx + gunicorn + Flask(这是一个工作 link 你可以用来查看当前的行为)。此 Heroku 应用的基础 URL 是 https://snowpacktracker.herokuapp.com.
当第一个 Heroku 应用收到请求时,Flask 应用会重定向到第二个 Heroku 应用 运行 Bokeh 服务器。按照目前的实施,您可以在浏览器中看到 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 的回答中的 link 来编辑 nginx.conf.erb
配置文件中的 location
块,但我没有运气。
在 location
块中 proxy_pass
或 proxy_redirect
(或 rewrite
?)的正确语句是什么以实现所需的行为?
我当前的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 or apache实现。
P.S。你的整个问题看起来很奇怪,请修改你的整个架构。
我认为您误解了 http://nginx.org/r/proxy_redirect 的作用。很明显,您试图将其设置为 off
以避免将面向用户的重定向(例如 301
和 302 Moved
)返回给用户,从而暴露内部域名,但这与指令的作用恰恰相反——最好将其保留为默认值。
如果你想让URL保持不变,就用http://nginx.org/r/proxy_pass。
我认为你的 "relevant flask code" 看起来有点多余,因为整个事情可以很容易地单独在 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-mobile';
);这显然会干扰您 "hide" 应用程序底层 URL 的愿望。
我在 Heroku 上部署了一个 Bokeh 服务器应用程序,具有多种样式,导致 URLs 很麻烦。例如:https://invlabs-bokehserver.herokuapp.com/avyview?style=snowpacktracker
我正在使用部署在 Heroku 上的 Flask 从简单的自定义域 (www.snowpacktracker.com) 获取扩展并重定向到第二个运行 Bokeh 服务器和 returns html 内容。相关 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()
我希望原始 URL 在 Flask 重定向发生时保持不变。 Flask 中是否有执行此操作的选项?或者我可以配置网络服务器来完成这个吗?
更新和更多细节:
我无法使 nginx 代理正常工作。我的现状:
www.snowpacktracker.com 设置为我的 Heroku 应用程序的自定义域(使用 Heroku 提供的 DNS 目标)运行 nginx + gunicorn + Flask(这是一个工作 link 你可以用来查看当前的行为)。此 Heroku 应用的基础 URL 是 https://snowpacktracker.herokuapp.com.
当第一个 Heroku 应用收到请求时,Flask 应用会重定向到第二个 Heroku 应用 运行 Bokeh 服务器。按照目前的实施,您可以在浏览器中看到 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 的回答中的 link 来编辑 nginx.conf.erb
配置文件中的 location
块,但我没有运气。
在 location
块中 proxy_pass
或 proxy_redirect
(或 rewrite
?)的正确语句是什么以实现所需的行为?
我当前的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 or apache实现。
P.S。你的整个问题看起来很奇怪,请修改你的整个架构。
我认为您误解了 http://nginx.org/r/proxy_redirect 的作用。很明显,您试图将其设置为 off
以避免将面向用户的重定向(例如 301
和 302 Moved
)返回给用户,从而暴露内部域名,但这与指令的作用恰恰相反——最好将其保留为默认值。
如果你想让URL保持不变,就用http://nginx.org/r/proxy_pass。
我认为你的 "relevant flask code" 看起来有点多余,因为整个事情可以很容易地单独在 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-mobile';
);这显然会干扰您 "hide" 应用程序底层 URL 的愿望。