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

我拥有一个域名(姑且称之为example.org ),并建立了一个CNAME指向从foo.example.org到AWS ELB FooBar-Load-Balancer-123456789.us-east-1.elb.amazonaws.com 。 该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 )以进行测试,听起来像是一个真正的解

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


因为我在技术上畅通无阻,所以将其作为答案发布,尽管我仍然非常感谢有人解释为什么会出现这些症状。

稍微调查一下,我发现:

$ 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>

所以它看起来像是向apache发出一个不带尾随斜线的目录请求(“目录需要一个尾部斜线,所以mod_dir发出重定向到http://servername/foo/dirname/. ”)。 这就解释了为什么使用http:// - apache的301响应中的Location标头为http://提供服务,所以“不知道更好”。 我想我可以通过使我的锚标记明确链接到带有斜杠的href来解决此问题。

为什么Apache这样配置? 为什么不直接自动解决到“内部”的适当位置,而无需对301响应进行往返? 而且,最重要的是 - 有没有更好的方法来解决这个问题? ELB可以配置为重写位置标题(我猜不是 - 我不是InfoSec专业版,但是这会让我感到等待发生的漏洞)? Apache可以吗?

链接地址: http://www.djcxy.com/p/41295.html

上一篇: Relative link (from https) gives 301 Permanently Moved (to http)

下一篇: How to make apache serve file:///