【问题标题】:Cherrypy application redirecting to http instead of https behind nginxCherrypy 应用程序重定向到 http 而不是 nginx 后面的 https
【发布时间】:2017-05-15 06:47:21
【问题描述】:

我有一个cherrypy webapp,我在一个带有ssl的nginx反向代理后面托管。

nginx位置是这样设置的:

    location /webapp {
        proxy_pass http://127.0.0.1:8642;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

当我加载 https://myaddress.com/webapp 时一切正常。页面加载正常。

但是当我点击任何链接时,它会打开http://myaddress.com/webapp/page,在带有 ssl 的 nginx 后面时不会加载。

链接很简单

<a href='/webapp/page'>Page</a>

然后我可以手动打开加载正常的https://myaddress.com/webapp/page。

我不明白为什么浏览器将它踢到 http:// 而不是停留在 https://

编辑:

我不久前(有点)想通了,然后忘记了这篇文章。

将主要方法名称从 index() 更改为 default() 修复了此问题。我不知道为什么,我在 CherryPy 文档中找不到任何内容。

所以当访问 mysite.com/news Cherrypy 现在返回 News.default() 而不是 News.index() 并且这不会更改 URI。

【问题讨论】:

  • 您是否检查过&lt;a href='/webapp/page'&gt;Page&lt;/a&gt; 真的按原样进入浏览器?您是否有任何 JS 点击处理程序,可能会改变这种行为?你用的是什么浏览器?
  • 这发生在 Chrome 和 Firefox 上。我没有测试过其他人。没有 javascript 处理链接。我发现将cherrypy中的方法名称从index()更改为default()不会将目标更改为http,但是当我执行HTTPRedirect()时,它会将其发送到http://而不是https://
  • 哦..我明白了。问题是cherrypy正在监听http并且对nginx一无所知。如果您在引发HTTPRedirect 时使用相对URI,它会尝试使用可用信息构建一个完整的URL 方案。或者,您可以使用 cherrypy.url() 函数自己生成一个绝对 URL。
  • cherrypy.url() 不返回 actual 请求。例如,我转到https://example.com/myapp,它简单地触发return cherrypy.url(),它输出http://example.com/myapp
  • 你应该传递基本参数

标签: python ssl nginx cherrypy


【解决方案1】:

您是否启用了反向代理工具?

您可以通过添加到您的配置文件中来做到这一点:

tool.proxy.on = True

或通过装饰。

@cherrypy.tools.proxy

该工具的部分功能是通过将协议从http 调整为https 来调整应用程序库。

【讨论】:

  • 我不确定它是否会有所帮助。需要测试。过去它没有为我提供正确的 FQDN。
猜你喜欢
  • 2014-06-30
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 2019-03-08
  • 2019-07-12
  • 2022-01-14
  • 1970-01-01
  • 2015-07-16
相关资源
最近更新 更多