Встановіть CURL для використання локальних віртуальних хостів


115

Використовуючи Apache або Ngnix, я завжди створюю сайти розробки на основі реальних проектів, таких як http://project1.loc, після додавання до свого .hostsфайлу, браузер не має проблем із використанням.

Однак, коли я намагаюся зробити запит CURL ( http://project1.loc/post.json) до тієї самої URL-адреси, я ніколи не отримую нічого, крім тайм-аута. Я припускаю, що CURL не піклується про мої власні хости, і він переходить безпосередньо на сервер імен, щоб отримати інформацію.

Як я можу це виправити?

ОНОВЛЕННЯ Я встановив спеціальний заголовок "HOST: http: //project1.loc ", і тепер я отримую 400 помилок - але вони миттєві, тому я припускаю, що cURL принаймні використовує файл хостів ...

Відповіді:


428

Насправді, у 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


26
Це мене вбиває - може хтось, будь ласка, позначити це правильною відповіддю? Це набагато новіше, ніж відповідь, тому не має голосів .. але прийнята відповідь неправильна (тобто працює лише для певних ситуацій) = (
Джон Харт

Це дійсно чудова відповідь, і я отримав свій голос. Лише Xenocross може відзначити відповідь прийнятою. З часом інші, швидше за все, прийдуть сюди і поступово проголосують за ваше вище.
hobodave

10
Варто зауважити, що --resolve був доданий лише в curl 7.21.3 - якщо ви застрягли на старшому хості (наприклад, Ubuntu 10.04 LTS), то варіант -H "Host ..." все ще є корисним резервним.
Кен

9
Хоча я згоден, це, мабуть, має бути прийнятою відповіддю (і я, звичайно, не ображався б, якщо ОП змінив її, навпаки), кажучи, що моя відповідь неправильна, це не правильно: це правильно для наявних у той час версій. запитання та відповідь було вироблено. Так що користувачів, яким ви не можете заважати читати минулу першу відповідь, а також оцінювати відповіді, виходячи зі своїх часових позначок, ніколи не отримаєте найкращої допомоги ...
Бруно,

1
Вибачте, Бруно, образи не означало.
Джон Харт

120

РЕДАКТУВАТИ: Хоча ця відповідь на даний момент прийнята, читачі можуть знайти цю іншу відповідь користувача Джона Харта більш пристосованою до їх потреб. Він використовує варіант, який, за словами користувача Кена , був представлений у версії 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заголовок.)


1
Я отримую 400 помилок з PHP, і коли я вручну роблю запит з curl.exe, я отримую індекс сервера за замовчуванням, що означає, що він не поважає HOSTзаголовок.
Xeoncross

Я пробував це на різних серверах з віртуальними хостами, і він працює (з командного рядка). Спробуйте Hostне про HOSTвсяк випадок (хоча я думаю, це не повинно бути чутливим до регістру). Як я вже сказав, переконайтеся, що ви використовуєте в Hostзаголовку лише ім’я хоста , нічого іншого (ні http://і /somethingпісля). Як ви створили файл хостів?
Бруно

Опубліковано більше даних про результати цього нижче.
Xeoncross

1
Як Бруно сказав нижче, проблема, ймовірно, полягає лише в налаштуваннях мого сервера, оскільки запит видає його і отримує помилку 403.
Xeoncross

Я пропустив "127.0.0.1 myvirtualhost.localhost" у файлі хостів, отже проблема.
Арвінд К.

2

Використовуйте справжнє повністю кваліфіковане доменне ім’я (наприклад dev.yourdomain.com), яке вказує на 127.0.0.1або спробуйте редагувати належний файл хостів (зазвичай / etc / hosts в * nix середовищах).


Я розробляю для Windows за допомогоюsystem32/drivers/etc/hosts
Xeoncross

Ви використовуєте нативну збірку cURL або якусь перекладинку cygwin? Я кажу це, тому що я не впевнений, як кожен вирішує свою DNS. Народний повинен забрати з файлу хостів Windows, але версія cygwin може захотіти версію cygwin. У будь-якому випадку використання реального домену, що вказує на 127.0.0.1, працювало б, але все налаштовано.
Олі

Я використовую вбудовану версію Windows, включену з PHP 5.3 для Windows (працює як php_fastcgi).
Xeoncross

2

Здається, це не рідкість.

Перевірте це спочатку.

Якщо це не допомагає, ви можете встановити локальний DNS-сервер у Windows, наприклад, цей . Налаштуйте Windows для використання localhost в якості сервера DNS. Цей сервер може бути налаштований як авторитетний для будь-яких підроблених доменів, які вам потрібні, і для переадресації запитів на реальні сервери DNS для всіх інших запитів.

Я особисто думаю, що це трохи вище, і не можу зрозуміти, чому файл хостів не працюватиме. Але це повинно вирішити проблему, яку ви маєте. Переконайтеся, що ви налаштували звичайні сервери DNS також як перенаправляючі.


Чи можете ви прочитати власну відповідь і переписати її? Англійська мова в третьому рядку не має сенсу!
ОмарОтман

Прибраний. Джи, здогадуюсь, я надрукував це занадто швидко, не читаючи належним чином.
Мет

1

Чи насправді сервер отримує запити, і чи правильно ви обробляєте ім'я хоста (псевдонім)?

після додавання до мого .hosts файл

Перевірте свій журнал веб-сервера, щоб побачити, як надходив запит ...

curl має параметри скинути надісланий запит, а отриманий відповідь називається слід, який буде збережено у файл.

- слід

Якщо у вас відсутня інформація про хост або заголовок - ви можете застосувати ці заголовки за допомогою параметра config.

Я отримаю запит на згортання, що працює в командному рядку, а потім спробую реалізувати в PHP.

Параметр config є

-K / - конфіг

варіанти, які є актуальними у завитках, тут

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

Знову ж таки, я використовую PHP у Windows для отримання сторінки на vhost у тих самих Windows, на яких працює nginx. У будь-якому разі, я зробив запит на vhost, http://domain.loc/users/getSettings.xmlі це те, про що показав access.log 127.0.0.1 - - [09/Aug/2010:11:42:55 -0500] "POST /users/getSettings.xml HTTP/1.1" 499 0 "-" "-"і згорнувся, Operation timed out after 10000 milliseconds with 0 bytes received тому я гадаю, що cURL насправді обробляє vhost, оскільки access.log показує запит. Знову ж таки, можливо, тепер це
перейде

"499 0" на цьому рядку ДУЖЕ значущий. Процес повернув нульові байти - якого завитка чекав. і повернув HTTP 499 - це дивний результат. зателефонуйте іншому сценарію - який повертає статичну рядок у відповідь на публікацію - і побачите, що ви отримуєте відповідь у згортанні. Ви багато хто не публікуєте дані так, як ви очікували ..., і сценарій може чекати на очікування відповіді. також змініть сценарій, щоб ввести вхід до тимчасового файлу та побачити, що ви "отримуєте очікувану публікацію від запиту на завиток"
Джордж Ламберт

Додайте, ви спробували згорнути командний рядок - щоб ви могли керувати публікацією та бачити відповідь сервера?
Джордж Ламберт

Швидка відповідь на друге питання - ні. Я не знаю, як отримати доступ до cURL командного рядка у Windows, оскільки він вбудований у PHP, а не у термінал Windows.
Xeoncross

1
ви можете завантажити версію командного рядка curl для windows звідси curl.haxx.se/download.html
Джордж Ламберт

1

Здійснення запиту до

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

Мій файл хостів виглядає так:

# 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призначений для повного заголовка, а не просто хоста, тому використовуйте -H 'Host: project1.loc'. Крім того, незважаючи на цю проблему, цей запит, здається, працює на правильному хості (отриманий правильно з вашого hostsфайлу, завиваючись принаймні в командному рядку). Те, що не працює (403), схоже на проблему аутентифікації / авторизації, тому ваш сервер, схоже, блокує ці запити. Я б запропонував виправити налаштування сервера для цього.
Бруно

0

Для налаштування віртуальних хостів на http-серверах Apache, які ще не підключені через DNS, я люблю використовувати:

curl -s --connect-to ::host-name: http://project1.loc/post.json

Там, де ім'я хоста - це IP-адреса або DNS-ім'я машини, на якій працює веб-сервер. Це також добре працює для https-сайтів.


1
Це повідомлення було надіслано 10 років тому та виправлено через коментарі, дякую за внесок. У таких видах публікацій, будь ласка, перевірте відповіді, чи є одяг для одягу, надішліть голосування інакше опублікуйте нову відповідь, тому що ви могли позначати як спам.
самухай
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.