स्थानीय वर्चुअल होस्ट का उपयोग करने के लिए cURL सेट करें


115

Apache या Ngnix का उपयोग करके मैं हमेशा वास्तविक परियोजनाओं पर आधारित विकास साइटें बनाता हूं जैसे कि http://project1.loc, मेरी .hostsफ़ाइल में जोड़ने के बाद , ब्राउज़र को उपयोग करने में कोई समस्या नहीं है।

हालाँकि, जब मैं http://project1.loc/post.jsonउसी URL के लिए एक CURL अनुरोध ( ) करने का प्रयास करता हूं, तो मुझे कभी भी कुछ भी नहीं मिलता है, लेकिन टाइमआउट। मुझे लगता है कि CURL मेरे कस्टम मेजबानों की परवाह नहीं करता है और यह जानकारी के लिए सीधे एक नाम सर्वर पर जाता है।

मैं इसे कैसे ठीक करूं?

अद्यतन मैं एक कस्टम हेडर "HOST: http: //project1.loc " सेट करता हूं और अब मुझे 400 त्रुटियां मिल रही हैं - लेकिन वे तात्कालिक हैं इसलिए मैं यह मान रहा हूं कि CURL कम से कम मेजबान फ़ाइल का उपयोग कर रहा है ...

जवाबों:


428

वास्तव में, कर्ल के पास स्पष्ट रूप से इसके लिए एक विकल्प है: --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.1URL में होस्टनाम से मेल नहीं खाता है ।

दूसरा उदाहरण HTTPS के साथ सही तरीके से काम करता है।

संक्षेप में, एक "होस्ट" हेडर के माध्यम से गुजरना -Hआपके होस्ट को हेडर सेट में हैक करता है, लेकिन कर्ल की होस्ट-विशिष्ट बुद्धि के सभी को बायपास करता है। --resolveसभी सामान्य तर्क का उपयोग करता है जो लागू होता है, लेकिन केवल दिखावा करता है DNS लुकअप आपके कमांड-लाइन विकल्प में डेटा लौटाता है। यह जैसा /etc/hostsचाहिए वैसा ही काम करता है ।

नोट --resolveपोर्ट नंबर लेता है, इसलिए HTTPS के लिए आप उपयोग करेंगे

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


26
यह मुझे मार रहा है - क्या कोई इसे सही जवाब के रूप में चिह्नित कर सकता है? यह उत्तर की तुलना में बहुत नया है, इसलिए वोट नहीं है .. लेकिन स्वीकृत उत्तर गलत है (यानी, केवल कुछ स्थितियों के लिए काम करता है) = (
जॉन हार्ट

यह वास्तव में एक महान जवाब है, और मेरा वोट प्राप्त किया है। केवल एक्सनोक्रॉस स्वीकृत के रूप में एक उत्तर को चिह्नित कर सकता है। समय के साथ अन्य लोग यहां आएंगे और धीरे-धीरे अपना वोट देंगे।
होबोड्वे

10
वर्थ नोटिंग कि-resolve को केवल कर्ल 7.21.3 में जोड़ा गया था - यदि आप एक पुराने होस्ट (जैसे Ubuntu 10.04 LTS) पर अटके हुए हैं, तो -H 'होस्ट ...' विकल्प अभी भी एक उपयोगी कमबैक है।
केन

9
जबकि मैं मानता हूं कि यह संभवतः स्वीकृत उत्तर होना चाहिए (और अगर ओपी ने इसे बदल दिया है, तो मैं निश्चित रूप से अपराध नहीं करूंगा), यह कहते हुए कि मेरा उत्तर गलत नहीं है: यह उस समय उपलब्ध संस्करणों के लिए सही है सवाल और जवाब का उत्पादन किया गया था। SO उपयोगकर्ता जिन्हें आप पहले उत्तर को पढ़ने में परेशान नहीं कर सकते हैं और उनके टाइमस्टैम्प के आधार पर उत्तरों का मूल्यांकन भी करते हैं, उन्हें कभी भी सबसे अच्छी मदद नहीं मिलेगी ...
ब्रूनो

1
क्षमा करें, ब्रूनो, कोई अपराध नहीं था।
जॉन हार्ट

120

EDIT: हालांकि यह वर्तमान में स्वीकृत उत्तर है, लेकिन उपयोगकर्ता जॉन हार्ट द्वारा अपनी आवश्यकताओं के अनुसार अधिक अनुकूल होने पर पाठकों को यह अन्य उत्तर मिल सकता है । यह एक विकल्प का उपयोग करता है, जो उपयोगकर्ता केन के अनुसार , 7.21.3 संस्करण में पेश किया गया था (जो दिसंबर 2010 में जारी किया गया था , अर्थात इस प्रारंभिक उत्तर के बाद)।


अपने संपादित प्रश्न में, आप URL को होस्ट नाम के रूप में उपयोग कर रहे हैं, जबकि इसे केवल होस्ट नाम की आवश्यकता है।

प्रयत्न:

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

जहां project1.locहै सिर्फ होस्ट नाम और 127.0.0.1लक्ष्य IP पता है।

(यदि आप लाइब्रेरी से कर्ल का उपयोग कर रहे हैं और कमांड लाइन पर नहीं, तो सुनिश्चित करें कि आपने हेडर http://में नहीं डाला है Host।)


1
मुझे PHP के साथ 400 त्रुटियां हो रही हैं और जब मैं कर्ल के साथ मैन्युअल रूप से अनुरोध करता हूं। मुझे सर्वर का डिफ़ॉल्ट इंडेक्स मिलता है जिसका अर्थ है कि यह HOSTहेडर का सम्मान नहीं कर रहा है ।
Xeoncross

मैंने इसे विभिन्न सर्वरों पर वर्चुअल होस्ट्स के साथ आज़माया है, और यह काम करता है (कमांड लाइन से)। प्रयास करें HostHOSTसिर्फ मामले में (हालांकि मुझे लगता है कि यह केस-संवेदी नहीं होना चाहिए)। जैसा कि मैंने कहा, सुनिश्चित करें कि आप Hostहेडर में केवल होस्टनाम का उपयोग कर रहे हैं , कुछ और नहीं (नहीं http://और /somethingबाद में)। आपने अपनी होस्ट फ़ाइल कैसे सेट की?
ब्रूनो

नीचे ऐसा करने के परिणामों के बारे में अधिक जानकारी पोस्ट करें।
Xeoncross

1
जैसा कि नीचे ब्रूनो ने कहा, समस्या शायद सिर्फ मेरा सर्वर कॉन्फिगर है क्योंकि अनुरोध इसे बना रहा है और 403 त्रुटि प्राप्त कर रहा है।
Xeoncross

मैंने "127.0.0.1 myvirtualhost.localhost" को होस्ट फ़ाइल में याद किया इसलिए समस्या हुई।
अरविंद के।

2

या तो एक वास्तविक पूरी तरह से योग्य डोमेन नाम का उपयोग करें (जैसे dev.yourdomain.com) जो इंगित करता है 127.0.0.1या उचित होस्ट फ़ाइल (आमतौर पर / आदि / होस्ट में * निक्स वातावरण) को संपादित करने का प्रयास करता है।


मैं का उपयोग कर विंडोज़ पर विकसितsystem32/drivers/etc/hosts
Xeoncross

क्या आप CURL के स्थानीय निर्माण या कुछ साइबर क्रॉस-बिल्ड का उपयोग कर रहे हैं? मैं यह कहता हूं क्योंकि मुझे यकीन नहीं है कि प्रत्येक अपने DNS को कैसे हल करता है। मूल निवासी को Windows 'होस्ट फ़ाइल से चुनना चाहिए, लेकिन एक साइबर संस्करण को एक साइबर संस्करण चाहिए। किसी भी तरह से, 127.0.0.1 की ओर इशारा करते हुए एक वास्तविक डोमेन का उपयोग करना काम करेगा हालांकि चीजें स्थापित की जाती हैं।
ओली

मैं विंडोज़ के लिए PHP 5.3 के साथ शामिल देशी विंडोज़ बिल्ड का उपयोग कर रहा हूं (php_fastcgi के रूप में चल रहा है)।
Xeoncross

2

ऐसा लगता है कि यह कोई असामान्य समस्या नहीं है।

यह पहले जांचें ।

अगर वह मदद नहीं करता है, तो आप इस तरह के रूप विंडोज, पर एक स्थानीय DNS सर्वर स्थापित कर सकते हैं इस । DNS सर्वर के रूप में लोकलहोस्ट का उपयोग करने के लिए विंडोज को कॉन्फ़िगर करें। इस सर्वर को आपके जितने भी नकली डोमेन की आवश्यकता हो, और अन्य सभी अनुरोधों के लिए वास्तविक DNS सर्वरों पर अनुरोधों को अग्रेषित करने के लिए अधिकृत किया जा सकता है।

मुझे व्यक्तिगत रूप से लगता है कि यह शीर्ष पर एक सा है, और यह नहीं देख सकता कि मेजबानों की फाइल क्यों नहीं चलेगी। लेकिन यह आपको होने वाली समस्या को हल करना चाहिए। सुनिश्चित करें कि आपने अपने सामान्य DNS सर्वर को फारवर्डर के रूप में भी सेट किया है।


क्या आप कृपया अपना स्वयं का उत्तर पढ़ सकते हैं और इसे फिर से लिख सकते हैं? तीसरी पंक्ति में अंग्रेजी का कोई मतलब नहीं है!
ओमरऑथमैन

Tidied। जी, लगता है कि मैंने इसे ठीक से पढ़े बिना बहुत तेजी से टाइप किया।
मैट

1

क्या सर्वर वास्तव में अनुरोध प्राप्त करता है, और क्या आप होस्ट नाम (उपनाम) को ठीक से संभाल रहे हैं?

मेरे .hosts फ़ाइल में जोड़ने के बाद

अनुरोध कैसे आया, यह देखने के लिए अपने वेबसर्वर लॉग की जाँच करें ...

कर्ल में भेजे गए अनुरोध को डंप करने के लिए विकल्प हैं, और प्राप्त प्रतिक्रिया, इसे ट्रेस कहा जाता है, जिसे एक फ़ाइल में सहेजा जाएगा।

--trace

यदि आप होस्ट या हेडर जानकारी याद कर रहे हैं - तो आप उन हेडर को कॉन्फिगर विकल्प के साथ बाध्य कर सकते हैं।

मुझे कमांड लाइन पर काम करने का कर्ल अनुरोध मिलेगा, और फिर PHP में लागू करने का प्रयास करेंगे।

विन्यास विकल्प है

कश्मीर / - config

कर्ल में प्रासंगिक विकल्प यहां हैं

-ट्रेस दी गई आउटपुट फ़ाइल में, विवरणात्मक जानकारी सहित सभी इनकमिंग और आउटगोइंग डेटा का एक पूर्ण ट्रेस डंप सक्षम करता है। का उपयोग करें "-" फ़ाइल नाम के रूप में उत्पादन करने के लिए भेजा 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 निर्दिष्ट करें कि कर्ल तर्कों को पढ़ने के लिए कौन सी फ़ाइल को कॉन्फ़िगर करें। कॉन्फ़िग फ़ाइल एक टेक्स्ट फ़ाइल है जिसमें कमांड लाइन तर्क लिखे जा सकते हैं जो तब उपयोग किए जाएंगे जैसे कि वे वास्तविक कमांड लाइन पर लिखे गए थे। विकल्प और उनके मापदंडों को एक ही कॉन्फिग फ़ाइल लाइन पर निर्दिष्ट किया जाना चाहिए, जिसे व्हाट्सएप, कोलोन द्वारा अलग किया जाता है, बराबर चिह्न या इसके किसी भी संयोजन (हालांकि, पसंदीदा सेपर-टोर बराबर चिह्न है)। यदि पैरामीटर में व्हॉट्सएप शामिल है, तो पैरामीटर को उद्धरण के भीतर संलग्न किया जाना चाहिए। दोहरे उद्धरण चिह्नों के भीतर, निम्नलिखित एस्केप सीक्वेंस उपलब्ध हैं: \ ", \", \ 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 का उपयोग कर रहा हूँ, उसी विंडो पर एक पेज लाने के लिए जो 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 अनुरोध दिखाता है। तो फिर, यह अब सही डोमेन के लिए बना रहा हो सकता है ...
Xeoncross

उस पंक्ति पर "499 0" बहुत महत्वपूर्ण है। प्रक्रिया शून्य बाइट्स लौटी - किस कर्ल के लिए इंतजार कर रहा था। और एक HTTP 499 लौटाया - जो एक अजीब परिणाम है। किसी अन्य स्क्रिप्ट को कॉल करें - जो पोस्ट के जवाब में एक स्थिर स्ट्रिंग लौटाती है - और देखें कि आपको कर्ल में प्रतिक्रिया मिल रही है। आप बहुत से डेटा पोस्ट नहीं कर रहे हैं जैसा कि आप उम्मीद करते हैं ... और स्क्रिप्ट प्रतिक्रिया के लिए इंतजार कर रही हो सकती है। एक अस्थायी फ़ाइल में इनपुट लॉग करने के लिए स्क्रिप्ट भी बदलें, और देखें कि आप "अपने कर्ल अनुरोध से अपेक्षित पोस्ट प्राप्त कर रहे हैं"
जॉर्ज लैम्बर्ट

क्या आपने कमांड लाइन कर्ल की कोशिश की - ताकि आप पोस्ट को नियंत्रित कर सकें और सर्वर प्रतिक्रिया देख सकें?
जॉर्ज लैम्बर्ट

दूसरे प्रश्न का त्वरित उत्तर - नहीं। मुझे नहीं पता कि विंडोज़ पर कमांड लाइन cURL का उपयोग कैसे किया जाता है क्योंकि यह PHP में बनाया गया है और विंडोज़ टर्मिनल नहीं।
Xeoncross


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- सर्वर पर वर्चुअल होस्ट स्थापित करने के लिए जो अभी तक DNS के माध्यम से जुड़े नहीं हैं, मुझे उपयोग करना पसंद है:

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

जहां होस्ट-नाम उस आईपी पते या उस मशीन का डीएनएस नाम है, जिस पर वेब-सर्वर चल रहा है। यह https- साइट्स के लिए भी अच्छा काम करता है।


1
इस पोस्ट को 10 साल पहले भेजा गया था और टिप्पणियों के माध्यम से तय किया गया था, योगदान के लिए धन्यवाद। इस तरह के पोस्ट में कृपया उत्तर के लिए जाँच करें, अगर कोई एसनवीयर है तो वोट भेजें और नया उत्तर पोस्ट करें क्योंकि आप स्पैम के रूप में चिह्नित कर सकते हैं।
समुहय
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.