首页 > 解决方案 > Flask 重定向命令间歇性地重定向到 http 而不是 https 链接

问题描述

我正在使用在 Traefik 后面的 apache2 docker 容器上运行的烧瓶。该应用程序是一个简单的留言簿应用程序。它具有一项功能,可让您对条目进行投票,从而获得积分。此链接只是更新数据库,然后将它们返回到主页。由于某种原因,它会间歇性地尝试重定向到主页的 http 链接而不是 https 链接。这是由 Traefik 处理的,它重定向回 https 链接。但是,我想弄清楚为什么会这样。

到目前为止,我已经尝试在主页上添加一个“检查”链接并单击它以消除投票代码作为问题,它所做的只是重定向回主页,问题仍然间歇性地发生。有趣的是,有时我实际上使用此链接获得了 200 状态,我认为这不应该发生在重定向上。

这是设置的样子:

初始化.py

@app.route('/', methods = ['GET','POST'])
def homepage():
    form = GuestbookForm(request.form)
    
    if "ID" not in session:
        session["ID"] = genuserid();
    
    if request.method == 'POST' and form.validate():
            name = form.name.data
            message = form.message.data
            setData( {"name":name, "message":message} )
            
    
    d = getData()
    if d[0] == 0:
        return render_template("guestbook.html", form=form, d=d[1])
    else:
        return str(d[1])

@app.route('/check/')
def check():
    return redirect(url_for("homepage"))

用于 traefik 的 docker-compose.yml 的相关部分

traefik:
    image: "traefik:v2.1"
    container_name: "traefik"
    command:
      #- "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      #Setups auto ssl with letsencrypt using http challenge.
      - "--certificatesresolvers.myresolver.acme.httpchallenge=true"
      - "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web"
      #- "--certificatesresolvers.myresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
      - "--certificatesresolvers.myresolver.acme.email=jcusitar@gmail.com"
      #Stores the certs in a json file that persists.
      - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
      - "--serverstransport.insecureskipverify=true"
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"

guestbook:
    image: guestbook:dev
    labels:
      # Enable container for traefik routing
      - "traefik.enable=true"
      - "traefik.http.middlewares.guestbook-redirect-web-secure.redirectscheme.scheme=https"
      - "traefik.http.routers.guestbook-web.middlewares=guestbook-redirect-web-secure"
      - "traefik.http.routers.guestbook-web.rule=Host(`domain`)"
      - "traefik.http.routers.guestbook-web.entrypoints=web"
      
      - "traefik.http.routers.guestbook-web-secure.rule=Host(`domain`)"
      - "traefik.http.routers.guestbook-web-secure.entrypoints=websecure"
      - "traefik.http.routers.guestbook-web-secure.tls.certresolver=myresolver" 
      - "traefik.http.services.guestbook.loadbalancer.server.port=443"
    volumes:
      - "./guestbookwww:/var/www/"
    networks:
      - stack    

请让我知道您认为可能会发生什么。如果需要其他信息,我可以添加。

编辑:

我发现这似乎与重定向功能有关。我重定向到整个网址(即:https://sub.domain.ca)并且效果很好。重定向到“/”会产生这种行为。

标签: dockerflaskredirectapache2traefik

解决方案


推荐阅读