Obwohl ich kein Experte für Ubuntu bin, habe ich seit zwei Jahren zwei Server ohne Probleme ausgeführt.
Als ich gestern Abend versuchte, auf eine lokale Website zuzugreifen, wurde der Fehler angezeigt:
**Bad Request**
Your browser sent a request that this server could not understand.
Additionally, a 400 Bad Request error was encountered while trying to use an ErrorDocument to handle the request.
Nach einigen Stunden Frustration und keinem Erfolg, baute ich den Server neu auf. Während der Installation von Ubuntu ging ich zu dem anderen Server und bekam genau den gleichen Fehler ... Der erste Server wurde jetzt neu erstellt und zeigt den gleichen Fehler an.
Ich habe jeden Computer im Netzwerk heruntergefahren. Router heruntergefahren und neu gestartet.
Neben den beiden Servern besteht das Netzwerk aus drei Windows-Computern und einem Ubuntu-Desktop.
Ich habe versucht, die Maschinen vom Internet zu trennen, ich habe sowohl kabelgebundene als auch drahtlose Clients versucht.
Wenn Sie auf den Servern zu localhost wechseln, wird die Seite Ubuntu Apache Default angezeigt.
Das einzige, was sich zu dem Zeitpunkt ereignete, als das Problem einsetzte, war, dass Windows beschlossen hatte, diesen Computer für ein Update herunterzufahren. Ich sehe nicht, wie dies ein Problem verursacht haben könnte, aber ich habe diese Maschine vom Netzwerk isoliert und das Problem besteht.
Ich habe Cookies gelöscht, fünf verschiedene Browser verwendet und alle melden den gleichen Fehler. Ich bin über Ideen und suche nach Anregungen.
In meinem Fall ist es eigentlich der Unterstrich_
in DocumentRoot, der Probleme und stundenlanges Debugging verursacht. Alle funktionieren gut, sobald ich sie aus meinem DocumentRoot-Pfad entferne.
Dies ist auf das Update RFC 3986 zurückzuführen, das behauptet, dass Unterstriche in virtuellen Host-Servernamen und anderen Elementen unsicher sind. In meinem Fall konnte ich den URL-Namen nicht ändern. Daher habe ich dies nur durch die Aktivierung dieser unsicheren URLs zugelassen. Fügen Sie dazu der httpd.conf-Datei einfach HttpProtocolOptions unsafe hinzu.
https://httpd.Apache.org/docs/2.4/mod/core.html#httpprotocoloptions
Für neuere httpd-Versionen werden Bindestriche in der URL nicht unterstützt. In diesem Fall müssen Sie HttpProtocolOptions unsicher zur httpd.conf-Datei hinzufügen. Danach funktioniert es einwandfrei.
Okay, ich bin zu 99,99% sicher, dass ich das Problem mithilfe von Capsule gefunden habe. Der Schlüssel zum Erfolg bestand darin, die Fehlerstufe von Apache in Debugging zu ändern. Dies gab mir einen Startpunkt und von da aus ein bisschen Ausprobieren und alles war gut.
Ich hatte zwei Server B777 und B767, die ich für die lokale Entwicklung verwendete. Für Entwicklungswebseiten habe ich so etwas wie www.something.767 und www.something.777 verwendet. Alle Websites wurden in einer Hosts-Datei aufgelistet.
Das hat seit einigen Jahren gut funktioniert. Aus irgendeinem Grund verstehe ich nie, dass ich gestern Abend auf beiden Servern und auf einem anderen, den ich heute Abend gebaut habe, den oben genannten Fehler erhalten habe.
Es scheint, dass das Problem die Verwendung von Zahlen im Domainnamen war. Sobald ich einen Domainnamen von www.something.767 in www.something.local (oder anscheinend andere nicht numerische Zeichen) geändert habe, war alles wieder normal.
Wenn Sie in Docker Compose das Netzwerk verwenden, über das Sie Containernamen als URLs/Hosts für die Kommunikation verwenden können, müssen Sie sicherstellen, dass im Namen keine Unterstriche verwendet werden (per Neros Antwort =).
Das hat mich für immer zum Debuggen gebracht, daher füge ich den anfänglichen Fehlertext unten (erneut) ein, sodass Google diese Frage hoffentlich ein wenig weiter oben an die nächste Person weiterleitet, die versucht, PHP Curl in einem Docker-Netzwerk zu beheben.
400 Bad Request Bad Request
Ihr Browser hat eine Anfrage gesendet, die dieser Server nicht verstehen konnte.
Außerdem ist beim Versuch, die Anforderung mit einem ErrorDocument zu verarbeiten, ein 400 Bad Request-Fehler aufgetreten.
Ich musste den Unterstrich (_
) aus der ServerName
-Direktive sowie den Hostnamen in /etc/hosts
entfernen.
Der Unterstrich in DocumentRoot
ist jedoch in Ordnung.
Daher sieht die entsprechende Zeile in /etc/hosts
folgendermaßen aus:
127.0.0.1 mycoolsite.localhost
Der entsprechende Block in /etc/Apache2/extra/httpd-vhosts.conf
sieht folgendermaßen aus:
<VirtualHost *:80>
DocumentRoot "/Users/satoshi/Sites/my_cool_site"
ServerName mycoolsite.localhost
ErrorLog "/private/var/log/Apache2/my_cool_site.localhost-error_log"
CustomLog "/private/var/log/Apache2/my_cool_site.localhost-access_log" common
</VirtualHost>
Vergessen Sie nicht, apachectl restart
auszuführen, nachdem Sie Ihre Änderungen vorgenommen haben.
Dieser Fehler hat mich tagelang verfolgt, bis ich ihn endlich bekam.
In meinem Fall habe ich eine CURL zu einer URL gemacht, die am Ende ein leeres Leerzeichen hat. Können Sie es glauben? Das Entfernen des Platzes war ausreichend, um gut zu funktionieren.