Establezca cURL para usar hosts virtuales locales

Usando Apache o Ngnix siempre creo sitios de desarrollo basados ​​en proyectos reales como http://project1.loc que, después de agregar a mi archivo .hosts , el navegador no tiene problemas para usarlo.

Sin embargo, cuando bash hacer una solicitud de cURL ( http://project1.loc/post.json ) a esa misma URL, nunca obtengo nada más que un tiempo de espera. Supongo que a cURL no le importan mis servidores personalizados y va directamente a un servidor de nombres para obtener su información.

¿Cómo puedo arreglar esto?

ACTUALIZACIÓN Configuré un encabezado personalizado “HOST: http: //project1.loc ” y ahora recibo 400 errores, pero son instantáneos, así que supongo que cURL está al menos usando el archivo de hosts …

EDITAR: Si bien esta es la respuesta actualmente aceptada, los lectores pueden encontrar esta otra respuesta del usuario John Hart más adecuada a sus necesidades. Utiliza una opción que, según el usuario Ken , se introdujo en la versión 7.21.3 (que se lanzó en diciembre de 2010 , es decir, después de esta respuesta inicial).


En su pregunta editada, está utilizando la URL como nombre de host, mientras que solo debe ser el nombre de host.

Tratar:

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

donde project1.loc es solo el nombre de host y 127.0.0.1 es la dirección IP de destino.

(Si usa Curl desde una biblioteca y no desde la línea de comandos, asegúrese de no colocar http:// en el encabezado Host ).

En realidad, curl tiene una opción explícita para esto: --resolve

En lugar de curl -H 'Host: yada.com' http://127.0.0.1/something

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

¿Cuál es la diferencia, preguntas?

Entre otros, esto funciona con HTTPS. Suponiendo que su servidor local tiene un certificado para yada.com , el primer ejemplo anterior fallará porque el certificado de yada.com no coincide con el nombre de host 127.0.0.1 en la URL.

El segundo ejemplo funciona correctamente con HTTPS.

En esencia, pasar un encabezado “Host” por -H piratea tu Host en el conjunto de encabezados, pero pasa por alto toda la inteligencia específica del host de curl. Usando --resolve aprovecha toda la lógica normal que se aplica, pero simplemente simula que la búsqueda de DNS devuelve los datos en su opción de línea de comandos. Funciona exactamente como /etc/hosts debería.

Nota: --resolve toma un número de puerto, por lo que para HTTPS --resolve

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

Utilice un nombre de dominio real totalmente calificado (como dev.yourdomain.com ) que apunte a 127.0.0.1 o intente editar el archivo de host adecuado (generalmente / etc / hosts en entornos * nix).

Parece que este no es un problema poco común.

Verifica esto primero.

Si eso no ayuda, puede instalar un servidor DNS local en Windows, como este . Configure Windows para usar localhost como el servidor DNS. Este servidor se puede configurar para ser autoritativo para los dominios falsos que necesite, y reenviar las solicitudes a los servidores DNS reales para todas las demás solicitudes.

Personalmente creo que esto es un poco exagerado, y no puedo ver por qué el archivo de hosts no funcionaría. Pero debería resolver el problema que estás teniendo. Asegúrese de configurar sus servidores DNS normales como reenviadores también.

¿El servidor realmente recibe las solicitudes y está manejando el nombre de host (alias) correctamente?

después de agregar a mi archivo .hosts

Verifique el registro de su servidor web, para ver cómo llegó la solicitud …

curl tiene opciones para volcar la solicitud enviada, y la respuesta recibida, se llama rastreo, que se guardará en un archivo.

–rastro

Si le falta información de host o encabezado, puede forzar esos encabezados con la opción de configuración.

Me gustaría obtener la solicitud curl trabajando en la línea de comandos, y luego tratar de implementar en PHP.

la opción de configuración es

-K / – config

las opciones que son relevantes en Curl están aquí

–trace Habilita un volcado de rastreo completo de todos los datos entrantes y salientes, incluida la información descriptiva, en el archivo de salida dado. Use “-” como nombre de archivo para enviar la salida a 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 Especifica de qué archivo de configuración leer los argumentos de curl. El archivo de configuración es un archivo de texto en el que se pueden escribir argumentos de línea de comando que luego se usarán como si estuvieran escritos en la línea de comando real. Las opciones y sus parámetros se deben especificar en la misma línea de archivo de configuración, separados por espacios en blanco, dos puntos, el signo igual o cualquier combinación de los mismos (sin embargo, el separador preferido es el signo igual). Si el parámetro debe contener espacios en blanco, el parámetro debe estar entre comillas. Dentro de las comillas dobles, están disponibles las siguientes secuencias de escape: \, \ “, \ t, \ n, \ r y \ v. Se ignora una barra invertida que precede a cualquier otra letra. Si la primera columna de una línea de configuración es un ‘#’ carácter, el rest de la línea se tratará como un comentario. Solo escriba una opción por línea física en el archivo de configuración.

  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. 

Hacer una solicitud a

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

Resulto en el archivo de registro -H que contiene:

 == 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: HTTP/1.1 403 ForbiddenHTTP/1.1 403 Forbidden 0071: 0 0074: == Info: Connection #0 to host project1.loc left intact == Info: Closing connection #0 

Mi archivo de hosts se ve así:

 # 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