Используя Apache или Ngnix я всегда создаю участки разработки на основе реальных проектов такой как http://project1.loc
который, после добавления к моему .hosts
файл, браузер не имеет никакой проблемы с помощью.
Однако, когда я пытаюсь выполнить ВИХРЕВОЙ запрос (http://project1.loc/post.json
) к тому же самому URL я никогда ничего не получаю кроме тайм-аута. Я предполагаю, что ЗАВИХРЕНИЕ не заботится о моих пользовательских хостах и переходит прямо к серверу имен, поскольку это - информация.
Как я могу зафиксировать это?
ОБНОВИТЕ я установил пользовательский заголовок "ХОСТ: http://project1.loc" и теперь я получаю 400 ошибок - но они мгновенны, таким образом, я предполагаю, что cURL, по крайней мере, использует файл hosts...
Либо используйте настоящее полное доменное имя (например, dev.yourdomain.com
), который указывает на 127.0.0.1
, или попробуйте отредактировать соответствующий файл hosts (обычно / etc / hosts в средах * nix).
РЕДАКТИРОВАТЬ: Хотя в настоящее время это принятый ответ, читатели могут найти этот другой ответ пользователя Джона Харта более адаптированным к своим потребностям. Он использует опцию, которая, по словам пользователя Кена , была представлена в версии 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
.)
Действительно ли сервер получает запросы, и правильно ли вы обрабатываете имя хоста (псевдоним)?
после добавления в файл .hosts
Проверьте журнал вашего веб-сервера, чтобы увидеть, как пришел запрос...
У curl есть опции, позволяющие записывать отправленный запрос и полученный ответ, это называется trace, который будет сохранен в файл.
--trace
Если вам не хватает информации о хосте или заголовков - вы можете принудительно добавить эти заголовки с помощью опции config.
Я бы заставил работать запрос curl в командной строке, а затем попытался бы реализовать его в PHP.
опция config -
-K/--config
опции, которые важны в curl, находятся здесь
--trace Включает полную трассировку всех входящих и исходящих данных, включая описательную информацию, в заданный выходной файл. Используйте "-" в качестве имени файла, чтобы вывод был отправлен в 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 Укажите, из какого файла конфигурации читать аргументы curl. Конфигурационный файл - это текстовый файл, в котором могут быть записаны аргументы командной строки, которые затем будут использоваться так, как если бы они были записаны в фактической командной строке. Опции и их параметры должны быть указаны в одной строке конфигурационного файла, разделенные пробелами, двоеточием, знаком равенства или любой их комбинацией (однако предпочтительным разделителем является знак равенства). тор - знак равенства). Если параметр должен содержать пробелы, его необходимо заключить в кавычки. Внутри двойных кавычек доступны следующие экранирующие последовательности: \, \", \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.
Похоже, что это не такая уж редкая проблема.
Сначала проверьте это.
Если это не поможет, вы можете установить локальный DNS-сервер в Windows, например, здесь. Настройте Windows на использование localhost в качестве DNS-сервера. Этот сервер можно настроить так, чтобы он был авторитетным для любых фальшивых доменов, которые вам нужны, а для всех остальных запросов перенаправлял запросы на настоящие DNS-серверы.
Я лично думаю, что это немного перебор, и не могу понять, почему файл hosts не будет работать. Но это должно решить проблему, с которой вы столкнулись. Убедитесь, что вы также настроили ваши обычные DNS-серверы в качестве переадресаторов.
Выполнение запроса к
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