Vorwort
Erstens: Ein einfaches Umschreiben von Port 80 -> Port 443 behebt dies NICHT . In fast jeder vorherigen Frage, jedem Mail-Thread, Forum-Thread usw. habe ich festgestellt, dass dies die erste ignorante Antwort war und mehrmals nachgeprüft wurde.
Zweitens: Ja, ich weiß, dass Sie keinen HTTP- und HTTPS-Verkehr auf demselben Port bereitstellen können. Das ist das nicht.
Szenario:
Apache Server, der mehrere Sites über Portmultiplikation hostet. Port 80 dient einer öffentlichen Site. Port 443 dient der sicheren Version dieser Site.
Die Ports 7443, 8443 und 9443 bedienen jeweils separate SSL-gesicherte Standorte.
Wenn ein Benutzer die URL falsch eingibt oder einen ungültigen Link erhält, z. B. http: //hostname.tld: 7443 , wird ihm die folgende lächerliche Seite angezeigt :
Anstatt dass der Server sie nur zu https: //hostname.tld: 7443 umleitet .
Meine Frage ist, wie können Sie im Namen von Zeus 'Arschloch das Verhalten von Apache oder diese Fehlermeldung ändern, um den Benutzer automatisch umzuleiten?
Apache bedient offensichtlich eine Nicht-https-Anforderung (um diese Fehlermeldung anzuzeigen), obwohl sie für HTTPS konfiguriert ist. Es erscheint mir bemerkenswert dumm, nicht nur standardmäßig die Weiterleitung durchzuführen, sondern ich kann auch verstehen, warum sie sich so verhalten haben, auch wenn ich damit nicht einverstanden bin. Meine Frage ist also: Kannst du es ändern? Sie behandeln den Fehler ÜBERALL, und da Apache das Füllhorn für die Konfiguration ist, liegt es nahe, dass es irgendwo eine Anweisung gibt, um dieses Verhalten zu behandeln, aber ich konnte es in mehreren Stunden des Bastelns bisher nicht finden.
Aktualisieren:
Ich habe verschiedene Dinge versucht, darunter:
Verwenden von
ErrorDocument 400
Anweisungen, um zu einem CGI und einem PHP-Skript zu gelangen, die nur sendenStatus 301
undLocation
Header. Dies führt zu einer leeren Seite. Wenn SieErrorDocument 400 https://hostname.tld:7443
einfach verwenden, wird dieser Link auf der Seite angezeigt.Wenn Sie fast jede Kombination von
mod_rewrite
I oder Google verwenden, können Sie sich ein Bild machen, einschließlich pauschaler Aussagen, die die Website vollständig steuern. diese funktionieren nie . Sie tun buchstäblich nichts. Ich vermute, dass Apache den oben genannten Fehler behebt, bevor er überhaupt versucht, die Anweisungen zum Umschreiben zu verarbeiten.
Ich kann aufgrund der benutzerdefinierten Portverwendung keine portbasierten Weiterleitungen verwenden. Ich kann keine skriptbasierten Weiterleitungen verwenden, da sie aufgrund der Nichtübereinstimmung von http / https nie bereitgestellt werden. Ich bin fast bereit, dies auf einen Fehler oder ein unbeabsichtigtes Verhalten zurückzuführen, aber jemand hatte die Voraussicht, eine sehr benutzerdefinierte Fehlermeldung einzutragen. Er machte sich nicht die Mühe zu denken, dass Sie vielleicht nur zum Wagen fahren möchten URL, die sie bereits bereitstellen ?
quelle
Antworten:
Ich denke, dies ist wahrscheinlich ein Fehler darin, wie Apache 2.2 und niedriger mit diesem besonderen Umstand umgeht.
Es scheint, dass
400 Bad Request
Apache 2.2 bei einem SSL- Lesefehler nicht den HTTP-Antwortcode oder die Header zurückgibt, sondern nur den HTTP-Antworttext. Ich teste durch Telnetting an Port 443 und sende:Der Server kehrt sofort zurück (für mich):
Beachten Sie das Fehlen eines HTTP-Antwortcodes oder von HTTP-Headern.
Wenn ich dies auf einem Apache 2.4-Server mache, erhalte ich:
Wenn ich eine ErrorDocument-Zeile wie Sie einrichte:
Dann bekomme ich den HTML-Code für eine 302-Umleitung, aber auch hier keinen der Header. Ohne den 302-Umleitungsantwortcode und den
Location:
Header wird der Browser nicht umleiten.Versuchen Sie ein Upgrade auf Apache 2.4 und prüfen Sie, ob es funktioniert. Ich habe mindestens Apache 2.4.3 getestet und bestätigt, aber ich habe mich nicht bemüht, genau herauszufinden, wann dieses Verhalten aktualisiert wurde. Ich vermute, dass sie in der großen Menge an Arbeit, die sie für die Vorbereitung von 2.4 geleistet haben, das unerwünschte Verhalten als Nebeneffekt korrigiert haben.
Relevante Apache httpd-Fehler:
AKTUALISIEREN
Sie können einen fehlerhaften Apache zwingen, Ihnen das gewünschte Verhalten (die Umleitung) zu geben, indem Sie das Skript seine Header ausdrucken lassen (die nicht an den Client gesendet werden) und dann die gewünschten Header manuell erneut ausdrucken. Hier ist ein grundlegendes Perl-Skript, das unter Apache 2.2.22 funktioniert:
Sie sollten sich bewusst sein, dass es andere Gründe gibt, warum ein 400 generiert werden kann, als nur mit einem SSL-Port ohne SSL zu sprechen. Der einfache Weg, dies festzustellen, besteht darin, nach der
HTTPS
Umgebungsvariablen zu suchen . Wenn es eingestellt ist, wurde SSL ordnungsgemäß ausgehandelt und etwas anderes verursacht die 400 (machen Sie nicht den Doppelheader-Trick, wenn dies der Fall ist). WennHTTPS
nicht festgelegt, geben Sie Ihre Weiterleitung wie oben beschrieben zurück.quelle
<javascript
Tag injizieren und Glück haben, wenn ich die Umleitung auf diese Weise hacke, aber bisher nein Würfel. Nichts davon scheint auf eine Weise gehandhabt zu werden, die der ansonsten ziemlich starren Apache-Großartigkeit folgt ...Sie können dies mit mod-rewrite beheben. Stellen Sie eine Regel ein, die mit allem übereinstimmt. Siehe diese Antwort auf Stackoverflow
quelle
sites-available
Verzeichnis auswendig gelernt . Selbst wenn Sie es nur in Unsinn umleiten oder auf eine andere Site, einen anderen Port usw. umleiten, wird diese 400 Bad Request immer wieder geladen.