Jeu de cURL pour l'utilisation locale des hôtes virtuels
À l'aide d'Apache ou Ngnix j'ai toujours de créer des sites de développement basées sur des projets réels tels que http://project1.loc
qui, après avoir ajouté à mon .hosts
fichier, le navigateur n'a pas de problème à l'utiliser.
Cependant, lorsque je tente de faire une demande cURL (http://project1.loc/post.json
) vers la même URL, je n'ai jamais obtenir quoi que ce soit, mais un délai d'attente. Je suis en supposant cURL n'est pas ma coutume hôtes et va directement à un serveur de nom pour c'est info.
Comment puis-je résoudre ce problème?
Mise à JOUR
J'ai mis un en-tête personnalisé "de l'HÔTE: http://project1.loc" et maintenant, je me fais des erreurs 400 - mais ils sont instantanées, donc je suis en supposant que cURL est au moins en utilisant le fichier hosts...
Vous devez vous connecter pour publier un commentaire.
En fait, le roulage est une option explicitement pour cette:
--resolve
Au lieu de
curl -H 'Host: yada.com' http://127.0.0.1/something
utilisation
curl --resolve 'yada.com:80:127.0.0.1' http://yada.com/something
Quelle est la différence, vous demandez-vous?
Entre autres, cela fonctionne avec le protocole HTTPS. En supposant que votre serveur local a un certificat pour
yada.com
, le premier exemple ci-dessus échoue car leyada.com
certificat ne correspond pas à la127.0.0.1
nom d'hôte de l'URL.Le deuxième exemple fonctionne correctement avec le protocole HTTPS.
En substance, le passage d'un "Hôte" de l'en-tête via
-H
ne hack votre Hôte dans l'en-tête set, mais ignore tout de curl est spécifique à l'hôte de l'intelligence. À l'aide de--resolve
tire parti de l'ensemble de la logique ordinaire qui s'applique, mais simplement prétend que la recherche de DNS retourné les données de votre option de ligne de commande. Il fonctionne comme/etc/hosts
devrait.Note
--resolve
prend un numéro de port, donc pour HTTPS, vous utilisezcurl --resolve 'yada.com:443:127.0.0.1' https://yada.com/something
EDIT: Alors que ce qui est actuellement accepté de répondre, les lecteurs pourraient trouver cette autre réponse par l'utilisateur John Hart plus adaptée à leurs besoins. Il utilise une option qui, selon l'utilisateur Ken, a été introduit 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 édité question, vous utilisez l'URL le nom de l'hôte, alors qu'il doit être le nom de l'hôte uniquement.
Essayer:
où
project1.loc
est juste le nom d'hôte et127.0.0.1
est l'adresse IP cible.(Si vous êtes en utilisant curl à partir d'une bibliothèque et non pas sur la ligne de commande, assurez-vous que vous ne mettez pas de
http://
dans leHost
en-tête.)HOST
en-tête.Host
pasHOST
juste au cas où (même si je pense que ça ne devrait pas être sensible à la casse). Comme je l'ai dit, assurez-vous que vous utilisez uniquement le nom d'hôte dans leHost
en-tête, rien d'autre (pas dehttp://
et pas de/something
après). Comment avez-vous mis en place votre fichier hosts?Soit utiliser un vrai nom de domaine pleinement qualifié (comme
dev.yourdomain.com
) que pointer à127.0.0.1
ou essayez de modifier le bon fichier hosts (généralement /etc/hosts sous *nix environnements).system32/drivers/etc/hosts
Il semble que ce n'est pas un problème rare.
Vérifier cette premier.
Si cela ne fonctionne pas, vous pouvez installer un serveur DNS local sur Windows, tels que cette. Configurer Windows pour utiliser localhost comme serveur DNS. Ce serveur peut être configuré pour faire autorité pour tout ce faux domaines dont vous avez besoin, et de rediriger les requêtes sur les vrais serveurs DNS pour toutes les autres demandes.
Personnellement, je pense que c'est un peu plus haut, et ne vois pas pourquoi le fichier hosts ne fonctionnerait pas. Mais il faut résoudre le problème que vous rencontrez. Assurez-vous de configurer votre DNS normale serveurs redirecteurs ainsi.
Ne le serveur obtenez en fait la demande, et vous manipulez le nom d'hôte (alias) correctement?
Vérifier votre serveur de journal, de voir comment la demande est arrivée...
curl a des options de vidage de la demande envoyée, et la réponse reçue, il est appelé trace, qui sera enregistré dans un fichier.
--trace
S'il vous manque de l'hôte ou des informations d'en-tête - vous pouvez forcer ces en-têtes avec l'option de configuration.
Je voudrais obtenir le curl demande de travail sur la ligne de commande, et ensuite essayer de les mettre en œuvre en PHP.
l'option de configuration est
-K/--config
les options qui sont pertinentes dans curl sont ici
--trace
Permet un suivi complet de vidage de toutes les données entrantes et sortantes, y compris des renseignements descriptifs, le fichier de sortie. Utiliser "-" comme nom de fichier pour avoir la sortie est envoyée sur la sortie standard stdout.
-K/--config
Spécifier le fichier de config pour lire curl arguments de. Le fichier de configuration est un fichier texte dans lequel les arguments de ligne de commande peuvent être écrits qui seront ensuite utilisées comme si elles étaient écrites sur le réel
ligne de commande. Options et de leurs paramètres doivent être spécifiés sur le même fichier de configuration de ligne, séparés par des espaces, du côlon, le signe égal, ou toute combinaison de ceux-ci (cependant, il est préférable de separa-
tor est le signe égal). Si le paramètre est de contenir d'espaces, le paramètre doit être entouré de guillemets. À l'intérieur de guillemets doubles, suivant les séquences d'échappement sont disponibles: \, \", \t, \n,
\r et \v. Une barre oblique inverse avant toute autre lettre est ignoré. Si la première colonne d'une ligne de config est un caractère"#", le reste de la ligne sera considérée comme un commentaire. Seulement écrire une option par
physique de la ligne dans le fichier de configuration.
http://domain.loc/users/getSettings.xml
et c'est ce que l'accès.le journal a montré127.0.0.1 - - [09/Aug/2010:11:42:55 -0500] "POST /users/getSettings.xml HTTP/1.1" 499 0 "-" "-"
et curl signaléOperation timed out after 10000 milliseconds with 0 bytes received
Donc je suppose que cURL est effectivement le serveur virtuel puisque l'accès.journal des spectacles de la demande. Puis de nouveau, il peut maintenant faire dans le domaine correct...De faire une demande de
A abouti à la
-H
fichier journal contenant:Mon fichier hosts ressemble:
-H
est pour l'en-tête complète, et pas seulement de l'hôte, afin de l'utiliser-H 'Host: project1.loc'
. En outre, en dépit de ce problème, cette demande semble pour travailler sur l'accueil correct (obtenu correctement à partir de votrehosts
fichier en boucle sur la ligne de commande au moins). Ce qui ne marche pas (403) semble être une authentification/autorisation de problème, de sorte que votre serveur semble être le blocage de ces demandes. Je vous suggère de fixation de la configuration de serveur pour cela.