Сохранить URL в браузере с помощью перенаправления Flask - PullRequest
0 голосов
/ 04 сентября 2018

У меня установлено серверное приложение Bokeh в Heroku с несколькими стилями, которые приводят к громоздким URL-адресам. Например: https://invlabs -bokehserver.herokuapp.com / avyview? Style = snowpacktracker

Я использую Flask, развернутый в Heroku, для получения расширений из простого пользовательского домена ( www.snowpacktracker.com ) и перенаправления во второе приложение Heroku, которое запускает сервер Bokeh и возвращает 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 настроен в качестве пользовательского домена (с использованием цели DNS, предоставленной Heroku) для моего приложения Heroku, на котором запущен nginx + gunicorn + Flask (это рабочая ссылка, которую вы можете использовать чтобы увидеть текущее поведение). Основной URL для этого приложения Heroku: 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 / исторический , который перенаправляет на https://invlabs -bokehserver.herokuapp.com / avyview .

Моя цель - загрузка страницы www.snowpacktracker.com (и любых расширений: / btac или / btac / history) для перенаправления через Flask, как в настоящее время реализовано, но для исходный URL остается неизменным.

Я пытался отредактировать блок location в файле конфигурации nginx.conf.erb по ссылке в ответе @Fian, но мне не повезло.

Какие правильные операторы для 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;
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

Я думаю, вы неправильно понимаете, что делает http://nginx.org/r/proxy_redirect. Очевидно, что вы пытаетесь установить его на off, пытаясь избежать перенаправления пользователя, например, 301 и 302 Moved, чтобы оно было возвращено пользователю, раскрывая внутренние доменные имена, но это прямо противоположно тому, что делает директива - почти всегда лучше оставить ее по умолчанию.

Если вы хотите, чтобы URL оставался без изменений, просто используйте http://nginx.org/r/proxy_pass.

0 голосов
/ 19 сентября 2018

Я думаю, что ваш "соответствующий код колбы" выглядит несколько излишним, поскольку все это может быть легко реализовано только в 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-адрес приложения.

0 голосов
/ 05 сентября 2018

То, что вы хотите, называется прокси и может быть достигнуто через nginx или apache .

P.S. Вся ваша проблема кажется довольно странной, пожалуйста, пересмотрите всю свою архитектуру.

...