2016-06-05 12 views
0

Ich besitze einen Domain-Namen (nennen wir es example.org), und haben einen CNAME von foo.example.org zu einem AWS ELB FooBar-Load-Balancer-123456789.us-east-1.elb.amazonaws.com eingerichtet. Dieser ELB hat eine Portkonfiguration von 443 (HTTPS, ACM Certificate <GUID>) forwarding to 80 (HTTP). Die einzige EC2-Instanz hinter dem ELB führt ein Docker-Image aus, das Apache an Port 80 freigibt.Relative Link (von https) gibt 301 Permanent Moved (zu http)

Wenn ich https://foo.example.org in meinem Webbrowser öffne, funktioniert alles gut - die Seite lädt wie erwartet. Wenn ich zu https://foo.example.org/path navigiere, wird es ebenfalls korrekt geladen. Wenn jedoch eine Seite <a href="path"> enthält, wird beim Klicken darauf, dass der Browser versucht, http://foo.example.org/path zu laden, was (korrekt) gibt einen Fehler - "ERR_CONNECTION_REFUSED" in Chrome, "Verbindung nicht möglich" in Firefox.

die Netzwerkaktivität in Chome Dev-Tool überprüfen, sehe ich eine anfängliche Anforderung an https://foo.example.org/path, die mit Location http://foo.example.org/path in 301 Moved Permanently (from cache) führt. Dies ist offensichtlich, was das Verhalten des Browsers verursacht - ist diese Fehlkonfiguration auf meinem Server (der glaubt, dass er auf HTTP - oder zumindest auf Port 80 - läuft), auf meinem ELB oder auf dem HTML der Website selbst?

Ich denke, ich könnte das umgehen, indem ich absolute Pfade benutze, aber da ich ein Docker-Bild lokal (Öffnen <IP Address>/path in meinem Browser) vor dem Drücken von Änderungen testen möchte, klingt das nicht wie eine echte Lösung.

EDIT: Inspiriert von this, überprüfte ich Verhalten in einem neuen Chrome Incognito Mode-Fenster und in Chrome nach dem Löschen der Geschichte - das gleiche Verhalten in allen Fällen.

Antwort

0

Posting dies als eine Antwort, da ich technisch unblockierten bin, obwohl ich sehr noch würde viel zu schätzen jemand mehr kenntnisreich zu erklären, warum diese Symptome aufgetreten.

Ein bisschen Untersuchung mit curl führte mich dies:

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

So sieht es aus wie making a request to apache for a directory without a trailing slash ("Directories einen Schrägstrich erfordern, so gibt mod_dir eine Umleitung zu http://servername/foo/dirname/."). Das erklärt, warum der Location-Header in der 301-Response http:// - Apache diente http://, also "wusste nicht besser". Ich denke, ich kann das lösen, indem ich meine Anker-Tags explizit mit einem href mit einem nachgestellten Schrägstrich verknüpfe.

Warum ist Apache auf diese Weise konfiguriert? Warum nicht einfach automatisch "intern" an den entsprechenden Ort auflösen, ohne die 301-Rückmeldung wiederholen zu müssen? Und, am wichtigsten - gibt es einen besseren Weg für mich, dieses Problem zu lösen? Kann ELB konfiguriert werden, um Location-Header neu zu schreiben (ich denke nicht - ich bin nicht InfoSec Pro, aber das erscheint mir als eine Schwachstelle warten auf passieren)? Kann Apache?