Установите cURL для использования локальных виртуальных хостов
Использование Apache или Ngnix. Я всегда создаю сайты разработки на основе реальных проектов, таких как http://project1.loc
, которые после добавления в мой файл .hosts
браузер не имеет проблем с использованием.
Однако, когда я пытаюсь сделать запрос cURL (http://project1.loc/post.json
) на тот же URL, я никогда не получаю ничего, кроме тайм-аута. Я предполагаю, что cURL не заботится о моих собственных хостах и идет прямо на сервер имен для получения информации.
Как я могу это исправить?
UPDATE
Я установил пользовательский заголовок "HOST: http://project1.loc", и теперь я получаю 400 ошибок - но они мгновенно, поэтому я предполагаю, что cURL по крайней мере, использует файл hosts...
Ответы
Ответ 1
РЕДАКТИРОВАТЬ. Хотя это принятый в настоящее время ответ, читатели могут найти этот другой ответ пользователем John Hart более приспособленные к их потребностям. Он использует опцию, которая, согласно пользователю Ken, была представлена в версии 7.21.3 (которая была выпущен в декабре 2010 года, т.е. после этого первоначального ответа).
В вашем отредактированном вопросе вы используете URL как имя хоста, тогда как оно должно быть только именем узла.
Try:
curl -H 'Host: project1.loc' http://127.0.0.1/something
где project1.loc
- это просто имя хоста, а 127.0.0.1
- целевой IP-адрес.
(Если вы используете завиток из библиотеки, а не в командной строке, убедитесь, что вы не помещаете http://
в заголовок Host
.)
Ответ 2
Собственно, 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
делает взлом вашего хоста в наборе заголовков, но обходит все зависящие от хоста характеристики. Использование --resolve
использует всю используемую обычную логику, но просто притворяется, что поиск в DNS возвращает данные в параметре командной строки. Он работает так же, как /etc/hosts
должен.
Примечание --resolve
принимает номер порта, поэтому для HTTPS вы должны использовать
curl --resolve 'yada.com:443:127.0.0.1' https://yada.com/something
Ответ 3
Используйте либо настоящее полное доменное имя (например, dev.yourdomain.com
), указывающее на 127.0.0.1
, либо попробуйте отредактировать правильный файл хостов (обычно/etc/hosts в средах * nix).
Ответ 4
Кажется, что это не необычная проблема.
Сначала проверьте this.
Если это не помогает, вы можете установить локальный DNS-сервер в Windows, например this. Настройте Windows для использования localhost в качестве DNS-сервера. Этот сервер может быть настроен на то, чтобы быть авторитетным для любых поддельных доменов, которые вам нужны, и пересылать запросы на реальные DNS-серверы для всех других запросов.
Я лично считаю, что это немного выше, и не может понять, почему файл hosts не работает. Но он должен решить проблему, с которой вы сталкиваетесь. Убедитесь, что вы также настроили свои обычные DNS-серверы как отправители.
Ответ 5
Действительно ли сервер получает запросы и правильно ли вы обрабатываете имя хоста (псевдоним)?
после добавления в мой файл .hosts
Проверьте журнал своего веб-сервера, чтобы узнать, как пришел запрос...
curl имеет опции для отправки отправленного запроса и полученного ответа, он называется 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.
-К/- конфигурации Укажите, какой конфигурационный файл нужно читать с помощью аргументов 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.
Ответ 6
Выполнение запроса
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