Mit Apache oder Ngnix erstelle ich immer Entwicklungsseiten, die auf realen Projekten basieren, z. B. http://project1.loc
die .hosts
der Browser nach dem Hinzufügen zu meiner Datei problemlos verwenden kann.
Wenn ich jedoch versuche, eine cURL-Anfrage ( http://project1.loc/post.json
) an dieselbe URL zu senden, wird nur eine Zeitüberschreitung angezeigt. Ich gehe davon aus, dass cURL sich nicht um meine benutzerdefinierten Hosts kümmert und direkt zu einem Nameserver geht, um Informationen zu erhalten.
Wie kann ich das beheben?
UPDATE Ich habe einen benutzerdefinierten Header "HOST: http: //project1.loc " gesetzt und jetzt werden 400 Fehler angezeigt - diese treten jedoch sofort auf, sodass ich davon ausgehe, dass cURL mindestens die Hosts-Datei verwendet ...
BEARBEITEN: Während diese Antwort derzeit akzeptiert wird, finden Leser diese andere Antwort von Benutzer John Hart möglicherweise besser an ihre Bedürfnisse angepasst. Es wird eine Option verwendet, die laut Benutzer Ken in Version 7.21.3 eingeführt wurde (die im Dezember 2010 veröffentlicht wurde , dh nach dieser ersten Antwort).
In Ihrer bearbeiteten Frage verwenden Sie die URL als Hostnamen, während es sich nur um den Hostnamen handeln muss.
Versuchen:
Dabei
project1.loc
ist nur der Hostname und127.0.0.1
die Ziel-IP-Adresse angegeben.(Wenn Sie Curl aus einer Bibliothek verwenden und nicht in der Befehlszeile, stellen Sie sicher, dass Sie nicht
http://
in dieHost
Kopfzeile einfügen.)quelle
HOST
Header nicht berücksichtigt wird .Host
nichtHOST
nur für den Fall (obwohl ich denke, dass es nicht zwischen Groß- und Kleinschreibung unterscheiden sollte). Wie gesagt, stellen Sie sicher, dass Sie nur den Hostnamen in derHost
Kopfzeile verwenden, sonst nichts (neinhttp://
und nein/something
danach). Wie haben Sie Ihre Hosts-Datei eingerichtet?Verwenden Sie entweder einen echten vollqualifizierten Domänennamen (wie
dev.yourdomain.com
), der auf127.0.0.1
die richtige Hosts-Datei verweist, oder versuchen Sie, diese zu bearbeiten (normalerweise / etc / hosts in * nix-Umgebungen).quelle
system32/drivers/etc/hosts
Es scheint, dass dies kein ungewöhnliches Problem ist.
Überprüfen Sie dies zuerst.
Wenn dies nicht hilft, können Sie unter Windows einen lokalen DNS-Server wie diesen installieren . Konfigurieren Sie Windows so, dass localhost als DNS-Server verwendet wird. Dieser Server kann so konfiguriert werden, dass er für alle von Ihnen benötigten gefälschten Domänen autorisierend ist und Anforderungen für alle anderen Anforderungen an die echten DNS-Server weiterleitet.
Ich persönlich denke, das ist etwas übertrieben und kann nicht verstehen, warum die Hosts-Datei nicht funktioniert. Aber es sollte das Problem lösen, das Sie haben. Stellen Sie sicher, dass Sie Ihre normalen DNS-Server auch als Weiterleitungen einrichten.
quelle
Erhält der Server tatsächlich die Anforderungen und behandeln Sie den Hostnamen (Alias) ordnungsgemäß?
Überprüfen Sie Ihr Webserver-Protokoll, um festzustellen, wie die Anfrage eingegangen ist ...
curl hat Optionen zum Speichern der gesendeten Anforderung und der empfangenen Antwort. Sie wird als Trace bezeichnet und in einer Datei gespeichert.
--Spur
Wenn Sie Host- oder Header-Informationen vermissen, können Sie diese Header mit der Konfigurationsoption erzwingen.
Ich würde die Curl-Anfrage in der Kommandozeile zum Laufen bringen und dann versuchen, sie in PHP zu implementieren.
Die Konfigurationsoption ist
-K / - config
Hier finden Sie die Optionen, die für Curl relevant sind
--trace Ermöglicht einen vollständigen Trace-Dump aller eingehenden und ausgehenden Daten, einschließlich beschreibender Informationen, in die angegebene Ausgabedatei. Verwenden Sie "-" als Dateinamen, um die Ausgabe an stdout zu senden.
-K / - config Geben Sie an, aus welcher Konfigurationsdatei Curl-Argumente gelesen werden sollen. Die Konfigurationsdatei ist eine Textdatei, in die Befehlszeilenargumente geschrieben werden können, die dann so verwendet werden, als ob sie in die eigentliche Befehlszeile geschrieben würden. Optionen und ihre Parameter müssen in derselben Konfigurationsdateizeile angegeben werden, getrennt durch Leerzeichen, Doppelpunkt, Gleichheitszeichen oder eine beliebige Kombination davon (der bevorzugte Trennzeichen ist jedoch das Gleichheitszeichen). Wenn der Parameter Leerzeichen enthalten soll, muss der Parameter in Anführungszeichen gesetzt werden. In doppelten Anführungszeichen stehen die folgenden Escape-Sequenzen zur Verfügung: \, \ ", \ t, \ n, \ r und \ v. Ein Backslash vor einem anderen Buchstaben wird ignoriert. Wenn die erste Spalte einer Konfigurationszeile ein '#' ist. Zeichen wird der Rest der Zeile als Kommentar behandelt.
quelle
http://domain.loc/users/getSettings.xml
und dies wurde im access.log angezeigt127.0.0.1 - - [09/Aug/2010:11:42:55 -0500] "POST /users/getSettings.xml HTTP/1.1" 499 0 "-" "-"
und im Curl gemeldet.Operation timed out after 10000 milliseconds with 0 bytes received
Ich denke also, dass cURL den vhost tatsächlich verarbeitet, da das access.log die Anfrage anzeigt.Anfrage stellen an
Ergebnis in der
-H
Protokolldatei mit:Meine Hosts-Datei sieht folgendermaßen aus:
quelle
-H
ist für den vollständigen Header, nicht nur Host, also verwenden-H 'Host: project1.loc'
. Darüber hinaus scheint diese Anforderung trotz dieses Problems auf dem richtigen Host zu funktionieren (der korrekt aus Ihrerhosts
Datei durch Curl in der Befehlszeile abgerufen wurde ). Was nicht funktioniert (403), scheint ein Authentifizierungs- / Autorisierungsproblem zu sein, sodass Ihr Server diese Anforderungen zu blockieren scheint. Ich würde vorschlagen, die Serverkonfiguration dafür zu korrigieren.Zum Einrichten von virtuellen Hosts auf Apache-HTTP-Servern, die noch nicht über DNS verbunden sind, verwende ich Folgendes:
Dabei ist Hostname die IP-Adresse oder der DNS-Name des Computers, auf dem der Webserver ausgeführt wird. Dies funktioniert auch gut für https-Sites.
quelle