web-dev-qa-db-fra.com

Définir cURL pour utiliser des hôtes virtuels locaux

Avec Apache ou Ngnix, je crée toujours des sites de développement basés sur des projets réels tels que http://project1.loc qui, après avoir ajouté à mon .hosts, le navigateur n’a aucun problème à utiliser.

Cependant, lorsque je tente de faire une requête cURL (http://project1.loc/post.json) vers cette même URL, je n’obtiens jamais autre chose qu’un délai d’expiration. Je suppose que cURL ne se soucie pas de mes hôtes personnalisés et va directement à un serveur de noms pour ses informations.

Comment puis-je réparer cela?

[~ # ~] update [~ # ~] J'ai défini un en-tête personnalisé "Host: http: //project1.loc = "et maintenant je reçois 400 erreurs - mais elles sont instantanées, donc je suppose que cURL utilise au moins le fichier hosts ...

105
Xeoncross

En fait, curl a une option explicite pour cela: --resolve

Au lieu de curl -H 'Host: yada.com' http://127.0.0.1/something

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

Quelle est la différence, vous demandez?

Entre autres, cela fonctionne avec HTTPS. En supposant que votre serveur local dispose d'un certificat pour yada.com, Le premier exemple ci-dessus va échouer car le certificat yada.com Ne correspond pas au nom d'hôte 127.0.0.1 Dans l'URL.

Le deuxième exemple fonctionne correctement avec HTTPS.

Essentiellement, passer un en-tête "Host" via -H Hachera votre hôte dans l'ensemble d'en-têtes, mais contournera toute l'intelligence spécifique à l'hôte de curl. Utiliser --resolve Exploite toute la logique normale qui s'applique, mais prétend simplement que la recherche DNS a renvoyé les données dans votre option de ligne de commande. Cela fonctionne exactement comme /etc/hosts.

Remarque --resolve Prend un numéro de port. Par conséquent, pour HTTPS, vous utiliseriez

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

387
John Hart

EDIT: Bien que cette réponse soit actuellement acceptée, le lecteur pourrait trouver cette autre réponse par utilisateur John Hart = plus adapté à leurs besoins. Il utilise une option qui, selon l’utilisateur Ken , a été introduite dans la version 7.21.3 (qui était sortie en décembre 201 , c’est-à-dire après cette réponse initiale).


Dans votre question modifiée, vous utilisez l'URL comme nom d'hôte, alors qu'il doit s'agir uniquement du nom d'hôte.

Essayer:

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

project1.loc est juste le nom d’hôte et 127.0.0.1 est l'adresse IP cible.

(Si vous utilisez curl depuis une bibliothèque et non sur la ligne de commande, assurez-vous de ne pas mettre http:// dans l'en-tête Host.)

120
Bruno

Soit utilisez un vrai nom de domaine complet (comme dev.yourdomain.com) qui pointe vers 127.0.0.1 ou essayez d’éditer le fichier hosts approprié (généralement/etc/hosts dans les environnements * nix).

2
Oli

Il semble que ce n’est pas un problème rare.

Vérifiez this d'abord.

Si cela ne vous aide pas, vous pouvez installer un serveur DNS local sous Windows, tel que this . Configurez Windows pour utiliser localhost en tant que serveur DNS. Ce serveur peut être configuré pour faire autorité pour tous les faux domaines dont vous avez besoin et pour transférer les demandes aux vrais serveurs DNS pour toutes les autres demandes.

Personnellement, je pense que c'est un peu exagéré et je ne vois pas pourquoi le fichier hosts ne fonctionnerait pas. Mais cela devrait résoudre le problème que vous rencontrez. Assurez-vous de configurer également vos serveurs DNS normaux en tant que redirecteurs.

2
Matt

Le serveur reçoit-il réellement les demandes et gérez-vous correctement le nom d'hôte (alias)?

après avoir ajouté à mon fichier .hosts

Consultez le journal de votre serveur Web pour voir comment la demande est arrivée ...

curl a des options pour vider la demande envoyée, et la réponse reçue, elle s'appelle trace, elle sera sauvegardée dans un fichier.

--trace

S'il vous manque des informations sur l'hôte ou l'en-tête, vous pouvez forcer ces en-têtes avec l'option config.

Je demanderais à la requête curl de fonctionner en ligne de commande, puis d’essayer de la mettre en œuvre en PHP.

l'option de configuration est

-K/- config

les options qui sont pertinentes dans curl sont ici

--trace Active un dump de trace complet de toutes les données entrantes et sortantes, y compris les informations descriptives, dans le fichier de sortie donné. Utilisez "-" comme nom de fichier pour que la sortie soit envoyée à stdout.

      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 Spécifie le fichier de configuration à partir duquel lire les arguments curl. Le fichier de configuration est un fichier texte dans lequel les arguments de ligne de commande peuvent être écrits et qui seront ensuite utilisés comme s'ils étaient écrits sur la ligne de commande réelle. Les options et leurs paramètres doivent être spécifiés sur la même ligne du fichier de configuration, séparés par un espace, des deux points, le signe égal ou une combinaison de ceux-ci (le séparateur préféré est toutefois le signe égal). Si le paramètre doit contenir des espaces, il doit être placé entre guillemets. Les séquences d'échappement suivantes sont disponibles entre guillemets: \,\",\t,\n,\r et\v. Une barre oblique inverse précédant toute autre lettre est ignorée. Si la première colonne d'une ligne de configuration est un" # " caractère, le reste de la ligne sera traité comme un commentaire N'écrivez qu'une option par ligne physique dans le fichier de configuration.

      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

Faire une demande à

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

Résultat dans le -H fichier journal contenant:

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

Mon fichier hosts ressemble à:

# 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