【发布时间】: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。
【问题讨论】:
-
您是否检查过
<a href='/webapp/page'>Page</a>真的按原样进入浏览器?您是否有任何 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 -
你应该传递基本参数