137 votes

Configurer cURL pour qu'il utilise les hôtes virtuels locaux

En utilisant 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 à l'utiliser.

Cependant, lorsque j'essaie d'effectuer une requête cURL ( http://project1.loc/post.json ) à cette même URL, je n'obtiens rien d'autre qu'un timeout. Je suppose que cURL ne se préoccupe pas de mes hôtes personnalisés et qu'il va directement chercher ses informations sur un serveur de noms.

Comment puis-je résoudre ce problème ?

MISE À JOUR J'ai défini un en-tête personnalisé "HOST : http://project1.loc "et j'obtiens maintenant des erreurs 400 - mais elles sont instantanées, donc je suppose que cURL utilise au moins le fichier hosts...

497voto

John Hart Points 865

En fait, curl dispose d'une option explicite pour cela : --resolve

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

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

Quelle est la différence ?

Cela fonctionne notamment avec HTTPS. En supposant que votre serveur local dispose d'un certificat pour yada.com le premier exemple ci-dessus échouera parce que le yada.com ne correspond pas au certificat 127.0.0.1 dans l'URL.

Le deuxième exemple fonctionne correctement avec HTTPS.

Essentiellement, le passage d'un en-tête "Host" par l'intermédiaire de -H intègre votre hôte dans le jeu d'en-têtes, mais contourne toute l'intelligence spécifique à l'hôte de curl. L'utilisation de --resolve exploite toute la logique normale qui s'applique, mais fait simplement comme si la recherche DNS renvoyait les données de votre option de ligne de commande. Cela fonctionne de la même manière que /etc/hosts devrait.

Note --resolve prend un numéro de port, donc pour HTTPS vous utiliseriez

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

30 votes

Cela me tue - quelqu'un peut-il, s'il vous plaît, marquer cette réponse comme étant la bonne ? Elle est beaucoup plus récente que la réponse, donc n'a pas les votes mais la réponse acceptée est fausse (c'est-à-dire qu'elle ne fonctionne que dans certaines situations) =(

0 votes

Il s'agit en effet d'une excellente réponse, et rec

11 votes

W

121voto

Bruno Points 47560

EDITAR: Bien qu'il s'agisse de la réponse actuellement acceptée, les lecteurs pourraient trouver que cette autre réponse par l'utilisateur John Hart plus adaptés à leurs besoins. Il utilise une option qui, selon l'utilisateur Ken a été introduite dans la version 7.21.3 (qui a été publié en décembre 2010 c'est-à-dire après cette première réponse).


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.

Essayez :

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

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

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

1 votes

J'obtiens des erreurs 400 avec PHP et lorsque je fais manuellement la requête avec curl.exe, j'obtiens l'index par défaut du serveur, ce qui signifie qu'il ne respecte pas la règle de l'index par défaut. HOST l'en-tête.

0 votes

Je l'ai essayé sur plusieurs serveurs avec des hôtes virtuels, et cela fonctionne (à partir de la ligne de commande). Essayer Host n HOST au cas où (même si je pense qu'il ne faut pas faire de distinction entre les majuscules et les minuscules). Comme je l'ai dit, assurez-vous que vous n'utilisez que le nom d'hôte dans le fichier Host et rien d'autre (pas de http:// et non /something après). Comment avez-vous configuré votre fichier hosts ?

0 votes

Vous trouverez ci-dessous plus d'informations sur les résultats de cette opération.

2voto

Oli Points 65050

Soit vous utilisez un véritable nom de domaine pleinement qualifié (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).

0 votes

Je développe sous Windows en utilisant system32/drivers/etc/hosts

0 votes

Utilisez-vous la version native de cURL ou une version croisée de cygwin ? Je dis cela parce que je ne suis pas sûr de la façon dont chacun résout son DNS. La version native de debe Le fichier hosts de Windows, mais une version cygwin pourrait vouloir une version cygwin. Quoi qu'il en soit, l'utilisation d'un vrai domaine pointant vers 127.0.0.1 fonctionnerait quelle que soit la configuration.

0 votes

J'utilise la version native pour Windows incluse avec PHP 5.3 pour Windows (Running as php_fastcgi).

2voto

Matt Points 8168

Il semble que ce problème ne soit pas rare.

Vérifier cette d'abord.

Si cela ne suffit pas, vous pouvez installer un serveur DNS local sous Windows, tel que cette . Configurez Windows pour qu'il utilise localhost comme serveur DNS. Ce serveur peut être configuré pour faire autorité pour les faux domaines dont vous avez besoin et pour transmettre 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. Veillez à configurer vos serveurs DNS normaux en tant que redirecteurs.

0 votes

Pourriez-vous lire votre propre réponse et la réécrire ? L'anglais de la troisième ligne n'a aucun sens !

0 votes

Rangé. Je crois que j'ai tapé trop vite sans avoir bien lu.

1voto

George Lambert Points 418

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

après avoir ajouté à mon fichier .hosts

Vérifiez le journal de votre serveur web, pour voir comment la demande est arrivée...

curl dispose d'options pour enregistrer la requête envoyée et la réponse reçue, c'est ce qu'on appelle la trace, qui 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 ferais fonctionner la requête curl en ligne de commande, puis j'essaierais de l'implémenter en PHP.

l'option de configuration est

-K/--config

les options pertinentes pour curl sont les suivantes

- Active une trace complète 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.

- Spécifie le fichier de configuration à partir duquel les arguments curl doivent être lus. Le fichier de configuration est un fichier texte dans lequel les arguments de la ligne de commande peuvent être écrits et seront utilisés comme s'ils avaient été écrits sur la ligne de commande. ligne de commande. Les options et leurs paramètres doivent être spécifiés sur la même ligne du fichier config, séparés par des espaces, des deux-points, le signe égal ou toute combinaison de ces éléments (le signe égal est toutefois la séparation préférée). le signe égal). Si le paramètre doit contenir des espaces, il doit être placé entre guillemets. Entre guillemets, les séquences d'échappement suivantes sont disponibles : \, \", \t , \n , \r y \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. O 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.

0 votes

Encore une fois, j'utilise PHP sur Windows pour récupérer une page sur un serveur virtuel sur le même Windows avec nginx. Quoi qu'il en soit, j'ai fait une requête à un serveur virtuel http://domain.loc/users/getSettings.xml et voici ce que le fichier access.log a montré 127.0.0.1 - - [09/Aug/2010:11:42:55 -0500] "POST /users/getSettings.xml HTTP/1.1" 499 0 "-" "-" et l'enroulement a été signalé Operation timed out after 10000 milliseconds with 0 bytes received Je suppose donc que cURL gère effectivement le serveur virtuel puisque le fichier access.log affiche la requête. Mais encore une fois, il se peut qu'elle arrive maintenant au bon domaine...

0 votes

Le "499 0" sur cette ligne est TRÈS significatif. Le processus a renvoyé zéro octet - que curl attendait - et a renvoyé un HTTP 499 - ce qui est un résultat étrange. Appelez un autre script - qui renvoie une chaîne statique en réponse au message - et vérifiez que vous obtenez la réponse dans curl. Vous ne postez peut-être pas les données comme vous le souhaitez... et le script attend peut-être la réponse. modifiez également le script pour enregistrer l'entrée dans un fichier temporaire, et constatez que vous "recevez le message attendu de votre requête curl".

0 votes

Add avez-vous essayé la ligne de commande curl - pour pouvoir contrôler le message et voir la réponse du serveur ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X