wake-up-neo.net

Stellen Sie cURL so ein, dass lokale virtuelle Hosts verwendet werden

Mit Apache oder Ngnix erstelle ich immer Entwicklungssites, die auf realen Projekten wie http://project1.loc die nach dem Hinzufügen zu meinem .hosts Datei hat der Browser kein Problem mit.

Wenn ich jedoch versuche, eine cURL-Anfrage zu stellen (http://project1.loc/post.json) auf dieselbe URL bekomme ich nur eine Zeitüberschreitung. Ich nehme an, cURL kümmert sich nicht um meine benutzerdefinierten Hosts und geht direkt zu einem Nameserver, um dessen Informationen zu erhalten.

Wie kann ich das beheben?

[~ # ~] update [~ # ~] Ich habe einen benutzerdefinierten Header festgelegt "Host: http: //project1.loc = "und jetzt erhalte ich 400 Fehler - aber sie treten sofort auf, also gehe ich davon aus, dass cURL zumindest die hosts-Datei verwendet ...

105
Xeoncross

Eigentlich hat curl eine explizite Option dafür: --resolve

Anstelle von curl -H 'Host: yada.com' http://127.0.0.1/something

benutze curl --resolve 'yada.com:80:127.0.0.1' http://yada.com/something

Was ist der Unterschied, fragst du?

Dies funktioniert unter anderem mit HTTPS. Angenommen, Ihr lokaler Server verfügt über ein Zertifikat für yada.com, Schlägt das erste obige Beispiel fehl, da das Zertifikat yada.com Nicht mit dem Hostnamen 127.0.0.1 In der URL übereinstimmt.

Das zweite Beispiel funktioniert ordnungsgemäß mit HTTPS.

Im Wesentlichen hackt das Übergeben eines "Host" -Headers über -H Ihren Host in die Header-Gruppe, umgeht jedoch die gesamte hostspezifische Intelligenz von curl. Die Verwendung von --resolve Nutzt die gesamte gültige Logik, gibt jedoch einfach vor, dass die DNS-Suche die Daten in Ihrer Befehlszeilenoption zurückgegeben hat. Es funktioniert genau so, wie es /etc/hosts Sollte.

Hinweis --resolve Verwendet eine Portnummer, also würden Sie für HTTPS verwenden

curl --resolve 'yada.com:443:127.0.0.1' https://yada.com/something

387
John Hart

BEARBEITEN: Während diese Antwort derzeit akzeptiert wird, finden Leser möglicherweise diese andere Antwort vom Benutzer John Hart = mehr an ihre Bedürfnisse angepasst. Es wird eine Option verwendet, die laut Benutzer Ken in Version 7.21.3 (die im Dezember 2010 veröffentlicht war, d. H. Nach dieser ersten Antwort) eingeführt wurde.


In Ihrer bearbeiteten Frage verwenden Sie die URL als Hostnamen, während es sich nur um den Hostnamen handeln muss.

Versuchen:

curl -H 'Host: project1.loc' http://127.0.0.1/something

dabei ist project1.loc nur der Hostname und 127.0.0.1 die Ziel-IP-Adresse.

(Wenn Sie curl aus einer Bibliothek verwenden und nicht in der Befehlszeile, stellen Sie sicher, dass Sie http:// Nicht in den Host -Header eingeben.)

120
Bruno

Verwenden Sie entweder einen echten vollqualifizierten Domainnamen (wie dev.yourdomain.com) das zeigt auf 127.0.0.1 oder versuchen Sie, die richtige Hosts-Datei zu bearbeiten (normalerweise/etc/hosts in * nix-Umgebungen).

2
Oli

Es scheint, dass dies kein ungewöhnliches Problem ist.

Überprüfen Sie zuerst this .

Wenn dies nicht hilft, können Sie einen lokalen DNS-Server unter Windows installieren, z. B. this . Konfigurieren Sie Windows so, dass localhost als DNS-Server verwendet wird. Dieser Server kann so konfiguriert werden, dass er für die von Ihnen benötigten gefälschten Domänen autorisierend ist und Anforderungen für alle anderen Anforderungen an die realen DNS-Server weiterleitet.

Ich persönlich halte das für etwas übertrieben und kann nicht nachvollziehen, warum die Hosts-Datei nicht funktioniert. Aber es sollte das Problem lösen, das Sie haben. Stellen Sie sicher, dass Sie auch Ihre normalen DNS-Server als Weiterleitungen einrichten.

2
Matt

Erhält der Server die Anforderungen tatsächlich und behandeln Sie den Hostnamen (Alias) ordnungsgemäß?

nach dem Hinzufügen zu meiner .hosts-Datei

Überprüfen Sie Ihr Webserver-Protokoll, um festzustellen, wie die Anfrage eingegangen ist ...

curl hat Optionen, um die gesendete Anfrage und die empfangene Antwort abzuspeichern. Dies wird als Trace bezeichnet und in einer Datei gespeichert.

--Spur

Wenn Host- oder Headerinformationen fehlen, können Sie diese Header mit der Option config erzwingen.

Ich würde die Curl-Anforderung in der Befehlszeile ausführen und dann versuchen, sie in PHP zu implementieren.

die Konfigurationsoption ist

-K/- Konfig

hier finden Sie die Optionen, die für die Wellung relevant sind

--trace Aktiviert 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.

      This option overrides previous uses of -v/--verbose or --trace-ascii.

      If this option is used several times, the last one will be used.

-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 der eigentlichen Befehlszeile geschrieben wären. Optionen und ihre Parameter müssen in derselben Konfigurationsdateizeile angegeben werden, getrennt durch Leerzeichen, Doppelpunkt, Gleichheitszeichen oder eine beliebige Kombination davon (bevorzugtes Trennzeichen ist jedoch das Gleichheitszeichen). Wenn der Parameter Leerzeichen enthalten soll, muss er in Anführungszeichen gesetzt werden. In doppelten Anführungszeichen stehen die folgenden Escape-Sequenzen zur Verfügung: \,\",\t,\n,\r und\v. Ein umgekehrter Schrägstrich vor einem anderen Buchstaben wird ignoriert. Wenn die erste Spalte einer Konfigurationszeile ein '#' ist Der Rest der Zeile wird als Kommentar behandelt. Schreiben Sie nur eine Option pro physischer Zeile in die Konfigurationsdatei.

      Specify the filename to -K/--config as '-' to make curl read the file from stdin.

      Note that to be able to specify a URL in the config file, you need to specify it using the --url option, and not by simply writing the URL on its own line. So, it could look similar to this:

      url = "http://curl.haxx.se/docs/"

      Long option names can optionally be given in the config file without the initial double dashes.

      When curl is invoked, it always (unless -q is used) checks for a default config file and uses it if found. The default config file is checked for in the following places in this order:

      1) curl tries to find the "home dir": It first checks for the CURL_HOME and then the HOME environment variables. Failing that, it uses getpwuid() on UNIX-like systems (which  returns  the  home  dir
      given the current user in your system). On Windows, it then checks for the APPDATA variable, or as a last resort the '%USERPROFILE%\Application Data'.

      2)  On windows, if there is no _curlrc file in the home dir, it checks for one in the same dir the curl executable is placed. On UNIX-like systems, it will simply try to load .curlrc from the deter-
      mined home dir.

      # --- Example file ---
      # this is a comment
      url = "curl.haxx.se"
      output = "curlhere.html"
      user-agent = "superagent/1.0"

      # and fetch another URL too
      url = "curl.haxx.se/docs/manpage.html"
      -O
      referer = "http://nowhereatall.com/"
      # --- End of example file ---

      This option can be used multiple times to load multiple config files.
1
George Lambert

Anfrage stellen an

C:\wnmp\curl>curl.exe --trace-ascii -H 'project1.loc' -d "uuid=d99a49d846d5ae570
667a00825373a7b5ae8e8e2" http://project1.loc/Users/getSettings.xml

Ergebnis: -H Protokolldatei mit:

== Info: Could not resolve Host: 'project1.loc'; Host not found
== Info: Closing connection #0
== Info: About to connect() to project1.loc port 80 (#0)
== Info:   Trying 127.0.0.1... == Info: connected
== Info: Connected to project1.loc (127.0.0.1) port 80 (#0)
=> Send header, 230 bytes (0xe6)
0000: POST /Users/getSettings.xml HTTP/1.1
0026: User-Agent: curl/7.19.5 (i586-pc-mingw32msvc) libcurl/7.19.5 Ope
0066: nSSL/1.0.0a zlib/1.2.3
007e: Host: project1.loc
0092: Accept: */*
009f: Content-Length: 45
00b3: Content-Type: application/x-www-form-urlencoded
00e4: 
=> Send data, 45 bytes (0x2d)
0000: uuid=d99a49d846d5ae570667a00825373a7b5ae8e8e2
<= Recv header, 24 bytes (0x18)
0000: HTTP/1.1 403 Forbidden
<= Recv header, 22 bytes (0x16)
0000: Server: nginx/0.7.66
<= Recv header, 37 bytes (0x25)
0000: Date: Wed, 11 Aug 2010 15:37:06 GMT
<= Recv header, 25 bytes (0x19)
0000: Content-Type: text/html
<= Recv header, 28 bytes (0x1c)
0000: Transfer-Encoding: chunked
<= Recv header, 24 bytes (0x18)
0000: Connection: keep-alive
<= Recv header, 25 bytes (0x19)
0000: X-Powered-By: PHP/5.3.2
<= Recv header, 56 bytes (0x38)
0000: Set-Cookie: SESSION=m9j6caghb223uubiddolec2005; path=/
<= Recv header, 57 bytes (0x39)
0000: P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
<= Recv header, 2 bytes (0x2)
0000: 
<= Recv data, 118 bytes (0x76)
0000: 6b
0004: <html><head><title>HTTP/1.1 403 Forbidden</title></head><body><h
0044: 1>HTTP/1.1 403 Forbidden</h1></body></html>
0071: 0
0074: 
== Info: Connection #0 to Host project1.loc left intact
== Info: Closing connection #0

Meine Hosts-Datei sieht folgendermaßen aus:

# Copyright (c) 1993-1999 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to Host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding Host name.
# The IP address and the Host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client Host

127.0.0.1       localhost
...
...
127.0.0.1   project1.loc
1
Xeoncross