En utilisant Apache ou Ngnix je crée toujours des sites de développement basés sur de vrais projets tels que http://project1.loc
, après avoir ajouté à mon .hosts
fichier, le navigateur n'a aucun problème à utiliser.
Cependant, lorsque j'essaye de faire une requête cURL ( http://project1.loc/post.json
) à cette même URL, je n'obtiens jamais autre chose qu'un timeout. 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?
MISE À JOUR J'ai défini un en-tête personnalisé "HOST: http: //project1.loc " et maintenant j'obtiens 400 erreurs - mais elles sont instantanées, donc je suppose que cURL utilise au moins le fichier hosts ...
EDIT: Bien que cette réponse soit actuellement acceptée, les lecteurs pourraient trouver cette autre réponse de l'utilisateur John Hart plus adaptée à leurs besoins. Il utilise une option qui, selon l'utilisateur Ken , a été introduite dans la version 7.21.3 ( sortie 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 ne doit s'agir que du nom d'hôte.
Essayer:
où
project1.loc
est juste le nom d'hôte et127.0.0.1
est l'adresse IP cible.(Si vous utilisez curl à partir d'une bibliothèque et non sur la ligne de commande, assurez-vous de ne pas mettre l'
http://
en-Host
tête.)la source
HOST
tête.Host
pasHOST
seulement au cas où (même si je pense que cela ne devrait pas être sensible à la casse). Comme je l'ai dit, assurez-vous que vous n'utilisez que le nom d'hôte dans l'en-Host
tête, rien d'autre (nonhttp://
et non/something
après). Comment avez-vous configuré votre fichier d'hôtes?Utilisez un vrai nom de domaine complet (comme
dev.yourdomain.com
) pointant vers127.0.0.1
ou essayez de modifier le fichier hosts approprié (généralement / etc / hosts dans les environnements * nix).la source
system32/drivers/etc/hosts
Il semble que ce ne soit pas un problème rare.
Vérifiez ceci en premier.
Si cela ne vous aide pas, vous pouvez installer un serveur DNS local sur Windows, tel que celui-ci . Configurez Windows pour utiliser localhost comme serveur DNS. Ce serveur peut être configuré pour faire autorité pour tous 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. Assurez-vous également de configurer vos serveurs DNS normaux en tant que redirecteurs.
la source
Le serveur reçoit-il réellement les requêtes et gérez-vous correctement le nom d'hôte (alias)?
Vérifiez 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, qui sera enregistrée dans un fichier.
--trace
S'il vous manque des informations d'hôte ou d'en-tête, vous pouvez forcer ces en-têtes avec l'option config.
Je ferais fonctionner la requête curl sur la ligne de commande, puis j'essayerais de l'implémenter en PHP.
l'option de configuration est
-K / - config
les options pertinentes pour curl sont ici
--trace Active un vidage 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 envoyer la sortie à stdout.
-K / - config Spécifie le fichier de configuration à partir duquel lire les arguments curl. Le fichier de configuration est un fichier texte dans lequel des arguments de ligne de commande peuvent être écrits 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 de fichier de configuration, séparés par des espaces, deux-points, le signe égal ou toute combinaison de ceux-ci (cependant, le séparateur préféré est le signe égal). Si le paramètre doit contenir des espaces, le paramètre doit être placé entre guillemets. Entre guillemets doubles, les séquences d'échappement suivantes sont disponibles: \, \ ", \ 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.
la source
http://domain.loc/users/getSettings.xml
et c'est ce que le 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 curl rapporté.Operation timed out after 10000 milliseconds with 0 bytes received
Donc je suppose que cURL gère réellement le vhost puisque le access.log montre la demande. Là encore, il se peut maintenant qu'ilFaire une demande à
Résultat dans le
-H
fichier journal contenant:Mon fichier d'hôtes ressemble à:
la source
-H
est pour l'en-tête complet, pas seulement pour l'hôte, alors utilisez-H 'Host: project1.loc'
. De plus, malgré ce problème, cette requête semble fonctionner sur le bon hôte (obtenu correctement à partir de votrehosts
fichier par curl sur la ligne de commande au moins). Ce qui ne fonctionne pas (403) semble être un problème d'authentification / autorisation, donc votre serveur semble bloquer ces demandes. Je suggère de corriger la configuration du serveur pour cela.Pour configurer des hôtes virtuels sur des serveurs http Apache qui ne sont pas encore connectés via DNS, j'aime utiliser:
Où host-name est l'adresse IP ou le nom DNS de la machine sur laquelle le serveur Web est exécuté. Cela fonctionne également bien pour les sites https.
la source