【发布时间】:2021-11-30 10:20:22
【问题描述】:
我在 docker 容器中使用管理员。
对于测试服务,我使用 URL mydomain.tld。为了直接寻址这个容器,我可以公开一个端口并映射,例如,端口8081 到管理员端口8080。
通过http://mydomain.tld:8081 直接寻址此容器没有问题,一切正常,登录对话框如下所示:
但是,这种方法会暴露用户和密码,所以不应该使用它。
但是,通过 https 使用相同的 docker 容器,我得到一个错误的页面。在这种情况下,通过地址https://mydomain.tld/adm 调用容器,该地址由地址为mydomain.tld 的Web 服务器在端口443 处转发到管理员容器以服务请求。方法很简单。结果与前者相同。为什么这不起作用?
我使用nginx 作为代理并且连接到管理员容器很好。现在我使用yaws 并将调用传递给管理员容器。
很明显,js 和 css 文件并没有被浏览器应用,无论是 Opera、Chrome、UR、Vivaldi、Edge 还是 Firefox,尽管源代码是正确且良好的。除 Firefox 外,没有浏览器在控制台中显示错误(错误消息由 Bing 翻译,我强调),但这些错误显然是错误归因的:
样式表 https://mydomain.tld/adm?file=default.css&version=4.8.1 未加载,因为其 MIME 类型 text/html 不是 text/css。
https://mydomain.tld/adm?file=functions.js&version=4.8.1 的脚本已加载,即使其 MIME 类型 (text/html) 不是对 JavaScript 有效的 MIME 类型。
这些错误信息是不正确的,从源代码中可以看出:MIME 类型肯定是text/css,rel 是stylesheet,并且脚本无论如何都应该是Javascript。
<link rel="stylesheet" type="text/css" href="?file=default.css&version=4.8.1">
<script src='?file=functions.js&version=4.8.1' nonce="ZDA0ODE4Y2ZhZWY1NzkyZTUxNzg3MGZlNTdlNTcxM2M="></script>
为什么 Firefox 将它们解释为 text/html(可能其他浏览器也是如此)?
当然,使用 GET 变量的相应 URL 看起来 不像标准文件,但它们应该可以工作,而且它们实际上可以通过多种方法显示:
-
如前所述,通过
html和端口8081 调用容器时,相同的源代码运行良好。 -
点击
https版本的HTML 源代码中的这些链接可以在任何浏览器中毫无问题地加载文件,这是应该的。 -
同样,开发者工具网络分析显示所有这些的 HTTP 代码 200,即使在 Firefox 中也是如此。
这在我看来证明浏览器接收到的代码是可以的,这里没有问题。无论哪种方式,源代码都是相同的,除了路径。
我什至操纵了 adminer 容器的输出以提供完整路径,但正如所料,这并没有改变任何事情,以下场景也证明了这一点:
在本地文件中使用任一输出的源代码。这里的引用不能被浏览器扩充,所以我们必须手动添加完整路径。通过在http 和https 版本之间切换路径FULL_PATH,我可以从本地文件重现该行为:
<link rel="stylesheet" type="text/css" href="FULL_PATH?file=default.css&version=4.8.1">
<!-- http://mydomain.tld:8081/ works; https://mydomain.tld/adm/ works per click, but not in browser-->
这个文件甚至不是https,因为它是从本地文件调用的,只有一个链接。
尽管开发人员工具显示一切正常,但浏览器为什么不以 https 的情况打开这些文件?这里有什么问题?是否有隐藏开关阻止使用 https 呈现这些文件?
我如何才能更智能地调试此问题以找到原因和补救措施?我现在已经没有想法了。
另请参阅yaws crashes with httpc:request for URL served by docker container,了解如何生成 html 内容。
【问题讨论】:
-
我发现了一些奇怪的东西。使用 curl 我看到该地址只被调用一次。原因是curl不关心css、js之类的。正如预期的那样,使用浏览器会发起额外的调用,例如adm:8080/?file=default.css&version=4.8.1。但是有一个电话是出乎意料的:“adm:8080/?script=version。不知道这是从哪里来的。也许这是导致错误的原因。我会尝试清除它,看看我得到了什么。
-
抱歉,这个解决方法也没有奏效。
-
如果我将端口 8081 限制为我自己的 IP,那么使用端口 8081 的解决方法并没有那么糟糕。所以我可以快乐地生活,但我仍然对解开这个谜感到好奇。
标签: css docker browser yaws adminer