gpt4 book ai didi

apache - 相对链接(来自 https)给出 301 永久移动(到 http)

转载 作者:太空宇宙 更新时间:2023-11-03 14:07:52 25 4
gpt4 key购买 nike

我拥有一个域名(我们称它为 example.org ),并设置了一个从 foo.example.org 指向 AWS ELB FooBar-Load-Balancer-123456789.us-east-1.elb.amazonaws.com 的 CNAME。该 ELB 的端口配置为 443 (HTTPS, ACM Certificate <GUID>) forwarding to 80 (HTTP) 。 ELB 背后唯一的 EC2 实例运行一个 Docker 镜像,在端口 80 上公开 Apache。

当我在网络浏览器中打开 https://foo.example.org 时,一切正常 - 页面按预期加载。如果我导航到 https://foo.example.org/path ,它同样会正确加载。但是,如果页面包含 <a href="path"> ,单击浏览器会尝试加载 http://foo.example.org/path ,这会(正确地)给出错误 - 在 Chrome 中为“ERR_CONNECTION_REFUSED”,在 Firefox 中为“无法连接”。

检查 Chome Dev Tools 中的网络事件,我看到了对 https://foo.example.org/path 的初始请求,该请求导致 301 Moved Permanently (from cache) 的位置为 http://foo.example.org/path 。这显然是导致浏览器行为的原因 - 这是我的服务器上的错误配置(它认为自己在 HTTP 上服务 - 或者至少在端口 80 上),我的 ELB 上,还是网站的 html 本身?

我想我可以通过使用绝对路径来解决这个问题,但是,鉴于我希望能够在本地启动 Docker 镜像(在我的浏览器中打开 <IP Address>/path)以在推送更改之前进行测试,这听起来不像真正的解决方案。

编辑:受 this 的启发,我在清除历史记录后在新的 Chrome 隐身模式窗口和 Chrome 中检查了行为——所有情况下的行为都相同。

最佳答案

因为我在技术上没有被屏蔽,所以将此作为答案发布,尽管我仍然非常感谢更有知识的人解释为什么这些症状发生。

对 curl 的一些调查让我想到了这一点:

$ curl -v https://foo.example.org/path
* Trying 52.0.230.252...
* Connected to foo.example.org (52.0.230.252) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate: example.org
* Server certificate: Amazon
* Server certificate: Amazon Root CA 1
* Server certificate: Starfield Services Root Certificate Authority - G2
> GET /path HTTP/1.1
> Host: foo.example.org
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Content-Type: text/html; charset=iso-8859-1
< Date: Sun, 05 Jun 2016 18:35:58 GMT
< Location: http://foo.example.org/path/
< Server: Apache/2.4.7 (Ubuntu)
< Content-Length: 336
< Connection: keep-alive
<
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://foo.example.org/path/">here</a>.</p>
<hr>
<address>Apache/2.4.7 (Ubuntu) Server at foo.example.org Port 80</address>
</body></html>
* Connection #0 to host foo.example.org left intact
$ curl https://foo.example.org/path/ # Note trailing slash
<expected html>

所以它看起来像making a request to apache for a directory without a trailing slash (“目录需要尾部斜杠,因此 mod_dir 发出重定向到 http://servername/foo/dirname/.”)。这解释了为什么 301 响应中的 Location header 使用 http:// - apache 服务于 http://,所以“不知道更好”。我想我可以通过使我的 anchor 标记明确链接到带有尾部斜杠的 href 来解决这个问题。

为什么 Apache 是这样配置的?为什么不“在内部”自动解析到适当的位置,而不必往返 301 响应?而且,最重要的是 - 我有更好的方法来解决这个问题吗? ELB 是否可以配置为重写 Location header (我猜不是——我不是 InfoSec 专家,但这让我觉得这是一个等待发生的漏洞)? Apache 可以吗?

关于apache - 相对链接(来自 https)给出 301 永久移动(到 http),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37643446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com