Установите cURL для использования локальных виртуальных хостов
используя Apache или Ngnix я всегда создаю сайты разработки на основе реальных проектов, таких как http://project1.loc
, которые, после добавления к моему , браузер не имеет никаких проблем с использованием.
однако, когда я пытаюсь сделать запрос cURL (http://project1.loc/post.json
) к тому же URL я никогда не получаю ничего, кроме тайм-аута. Я предполагаю, что cURL не заботится о моих пользовательских хостах и идет прямо на сервер имен для его информации.
как я могу это исправить?
обновление Я пользовательский заголовок " HOST:http://project1.loc " и теперь я получаю 400 ошибок-но они мгновенны, поэтому я предполагаю, что cURL по крайней мере использует файл hosts...
6 ответов:
EDIT: в то время как это в настоящее время принято ответ, читатели могут найти этот и другие ответы по Джон Харт более адаптированы к их потребностям. Он использует опцию, которая, согласно пользователю Кен, был представлен в версии 7.21.3 (которая была выпущен в декабре 2010 года, т. е. после этого первоначального ответа).
в редактируемом вопросе вы используете URL-адрес в качестве имени хоста, тогда как он должен быть только имя хоста.
попробуй:
curl -H 'Host: project1.loc' http://127.0.0.1/something
здесь
project1.loc
и просто имя хоста и127.0.0.1
целевой IP-адрес.(если вы используете curl из библиотеки, а не в командной строке, убедитесь, что вы не поставить
http://
наHost
заголовок.)
на самом деле, curl имеет опцию явно для этого:
--resolve
вместо
curl -H 'Host: yada.com' http://127.0.0.1/something
использовать
curl --resolve 'yada.com:80:127.0.0.1' http://yada.com/something
какая разница, спросите вы?
среди прочего, это работает с HTTPS. Предполагая, что ваш локальный сервер имеет сертификат для
yada.com
первый пример выше не удастся, потому чтоyada.com
сертификат не соответствует127.0.0.1
имя хоста в URL.второй пример работает правильно ПРОТОКОЛ HTTPS.
по сути, передавая заголовок "Host" через
-H
взламывает ваш хост в набор заголовков, но обходит весь интеллект конкретного хоста curl. Используя--resolve
использует всю нормальную логику, которая применяется, но просто делает вид, что поиск DNS вернул данные в вашей опции командной строки. Он работает так же, как/etc/hosts
должны.Примечание
--resolve
принимает номер порта, поэтому для HTTPS вы бы использовали
curl --resolve 'yada.com:443:127.0.0.1' https://yada.com/something
либо использовать полное доменное имя (например,
dev.yourdomain.com
), что указывает на127.0.0.1
или попробуйте отредактировать соответствующий файл hosts (обычно /etc/hosts в средах *nix).
кажется, что это не редкая проблема.
Регистрация этой первый.
Если это не помогает, вы можете установить локальный DNS-сервер на Windows, например этой. Настройка Windows для использования localhost в качестве DNS-сервера. Этот сервер может быть настроен как авторитетный для любых поддельных доменов, которые вам нужны, и для пересылки запросов на реальные DNS-серверы для всех других запросов.
Я лично думаю, что это немного более сверху, и не могу понять, почему файл hosts не будет работать. Но это должно решить вашу проблему. Убедитесь, что вы также настроили свои обычные DNS-серверы в качестве форвардеров.
действительно ли сервер получает запросы, и вы правильно обрабатываете имя хоста (псевдоним)?
после добавления в мой .hosts file
Проверьте журнал вашего веб-сервера, чтобы увидеть, как пришел запрос...
curl имеет опции для сброса отправленного запроса и полученного ответа, он называется trace, который будет сохранен в файл.
-- trace
Если у вас отсутствует информация о хосте или заголовке-вы можете принудительно эти заголовки с возможностью конфигурации.
Я бы получил запрос curl, работающий в командной строке, а затем попытался реализовать в PHP.
опции конфигурации
- K / --config
параметры, которые актуальны в curl здесь
--след Обеспечивает полный дамп трассировки всех входящих и исходящих данных, включая описательную информацию, в данный выходной файл. Используйте " - " в качестве имени файла для отправки выходных данных стандартный вывод.
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 Укажите, из какого файла конфигурации следует читать аргументы curl. Конфигурационный файл-это текстовый файл, в который могут быть записаны аргументы командной строки, которые затем будут использоваться так, как если бы они были записаны на фактическом командная строка. Параметры и их параметры должны быть указаны в одной строке файла конфигурации, разделенной пробелом, двоеточием, знаком равенства или любой их комбинацией (однако предпочтительнее разделять- Тор-это равные знак.) Если параметр должен содержать пробелы, он должен быть заключен в кавычки. В двойных кавычках доступны следующие escape-последовательности:\,\", \t, \n, \r и \v. обратная косая черта, предшествующая любой другой букве, игнорируется. Если первый столбец строки конфигурации является символом'#', остальная часть строки будет рассматриваться как комментарий. Только напишите один вариант в физическая строка в конфигурационном файле.
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.
сделать запрос к
C:\wnmp\curl>curl.exe --trace-ascii -H 'project1.loc' -d "uuid=d99a49d846d5ae570 667a00825373a7b5ae8e8e2" http://project1.loc/Users/getSettings.xml
в результате
-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
мой hosts файл выглядит так:
# 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