2010-08-02 29 views
73

Uso de 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 ningún problema al usarlo.Establezca cURL para usar hosts virtuales locales

Sin embargo, cuando intento realizar 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 solucionar esto?

ACTUALIZACIÓN fijo una cabecera "HOST: http://project1.loc" costumbre y ahora estoy recibiendo 400 errores - pero ellos son instantáneos, así que estoy asumiendo que La curvatura es, al menos, utilizando el archivo hosts ...

Respuesta

91

EDIT: Si bien esto es actualmente aceptada respuesta, los lectores podrían encontrar this other answer por el usuario John Hart más adaptado a sus necesidades. Utiliza una opción que, según el usuario Ken, se introdujo en la versión 7.21.3 (que era released in December 2010, es decir, después de esta respuesta inicial).


En su pregunta editada, que está utilizando la URL como nombre de host, mientras que tiene que ser sólo el nombre de host.

Probar:

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

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

(Si está utilizando rizo de una biblioteca y no en la línea de comandos, asegúrese de que usted no pone http:// en la cabecera Host.)

+1

Recibo 400 errores con PHP y cuando realizo manualmente la solicitud con curl.exe obtengo el índice predeterminado del servidor, lo que significa que no respeta el encabezado 'HOST'. – Xeoncross

+0

Lo he probado en varios servidores con hosts virtuales, y funciona (desde la línea de comandos). Pruebe 'Host' no' HOST' solo por si acaso (aunque creo que no debería ser sensible a mayúsculas y minúsculas). Como dije, asegúrese de estar utilizando solo el nombre de host en el encabezado 'Host', nada más (no' http: // 'y no'/something' después). ¿Cómo configuró su archivo de hosts? – Bruno

+0

Publicó más datos sobre los resultados de hacer esto a continuación. – Xeoncross

1

O 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 hosts adecuado (generalmente/etc/hosts en entornos * nix).

+0

que desarrollo en las ventanas usando 'system32/drivers/etc/hosts' – Xeoncross

+0

¿Está utilizando la estructura nativa de Curl o alguna cygwin cross-build? Digo esto porque no estoy seguro de cómo cada uno resuelve su DNS. El * nativo * debería * recoger desde el archivo de hosts de Windows, pero una versión de cygwin podría querer una versión de cygwin. De cualquier manera, el uso de un dominio real apuntando a 127.0.0.1 funcionaría sin embargo las cosas están configuradas. – Oli

+0

Estoy usando la versión de Windows nativa incluida con PHP 5.3 para Windows (se ejecuta como php_fastcgi). – Xeoncross

0

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

después de añadir a mis .hosts presentar

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

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

--trace

Si se echa en falta host o la cabecera de la información - se puede obligar a los 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 rizo están aquí

--trace activa el volcado traza completa de todos los datos entrantes y salientes , incluida la información descriptiva, al 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 en qué archivo de configuración para leer argumentos de enrollamiento. 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 archivos de configuración, separados por espacios en blanco, dos puntos, el signo igual o cualquier combinación de los mismos (sin embargo, la separación preferida es tor 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, \ ry \ 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 resto 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. 
+0

De nuevo, estoy usando PHP en Windows para buscar una página en un vhost en la misma ventana que ejecuta nginx. De todos modos, hice una solicitud a un vhost 'http: // domain.loc/users/getSettings.xml' y esto es lo que access.log mostró' 127.0.0.1 - - [09/Aug/2010: 11: 42:55 -0500] "POST /users/getSettings.xml HTTP/1.1" 499 0 "-" "-" 'y curl informaron' La operación agotó el tiempo después de 10000 milisegundos con 0 bytes recibidos' Así que supongo que cURL es realmente manejando el vhost ya que access.log muestra la solicitud. Por otra parte, ahora podría estar llegando al dominio correcto ... – Xeoncross

+0

El "499 0" en esa línea es MUY significativo. El proceso devolvió cero bytes: qué curva estaba esperando. y devolvió un HTTP 499, que es un resultado extraño. llama a otro script - que devuelve una cadena estática en respuesta a la publicación - y ve que estás obteniendo la respuesta en curl. No publicará los datos como espera ... y el script puede agotar el tiempo de espera de la respuesta. también cambian la secuencia de comandos para registrar la entrada a un archivo temporal y ver que está "recibiendo la publicación esperada de su solicitud curl" –

+0

Añadir ¿Probó la curva de línea de comando? Para que pudiera controlar la publicación y ver el servidor ¿respuesta? –

1

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

Comprobar this primero.

Si esto no funciona, se puede instalar un servidor DNS local en Windows, tales como this. 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.

Yo personalmente creo que esto es un poco exagerado, y no se puede 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.

+0

¿Podría leer su propia respuesta y volver a escribirla? ¡El inglés en la tercera línea no tiene sentido! – OmarOthman

+0

Tidied. Caramba, supongo que tecleé eso demasiado rápido sin leerlo correctamente. – Matt

0

Hacer una petición a

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

resultado en el archivo de registro que contiene -H:

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

Mi archivo de hosts se parece a:

# 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

'-H' es para el encabezado completo, no solo para el host, así que use' -H 'Host: project1.loc''. Además, a pesar de este problema, esta solicitud parece funcionar en el host correcto (obtenido correctamente de su archivo 'hosts' al curl en la línea de comando al menos). Lo que no funciona (403) parece un problema de autenticación/autorización, por lo que su servidor parece estar bloqueando estas solicitudes. Sugiero arreglar la configuración del servidor para esto. – Bruno

286

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

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

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

Cuál es la diferencia, usted pregunta?

Entre otros, este funciona con HTTPS. Asumiendo que su servidor local tiene un certificado para yada.com, el primer ejemplo anterior fallará porque el certificado 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, pasando un "anfitrión" de cabecera a través de -H no hackear su anfitrión en el conjunto de cabecera, pero no pasa por toda la inteligencia específica del huésped de rizo. El uso de --resolve aprovecha toda la lógica normal que se aplica, pero simplemente simula que la búsqueda DNS devolvió los datos en su opción de línea de comandos. Funciona igual que /etc/hosts debería.

Nota --resolve lleva un número de puerto, por lo que para HTTPS que usaría

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

+16

Esto me está matando. ¿Puede alguien marcar esto como la respuesta correcta? Es mucho más nuevo que la respuesta, por lo tanto no tiene los votos ... pero la respuesta aceptada es incorrecta (es decir, solo funciona para ciertas situaciones) = ( –

+0

) Esta es una gran respuesta y recibió mi voto. Solo Xenocross puede marcar una respuesta aceptada. Con el tiempo, es probable que otros vengan aquí y voten gradualmente a los suyos más altos. – hobodave

+10

. Vale la pena señalar que --resolve solo se agregó en Curl 7.21.3 - si está atrapado en un host anterior (por ejemplo, Ubuntu 10.04 LTS) la opción -H 'Host ...' sigue siendo una alternativa útil. – Ken

Cuestiones relacionadas