CURL'yi yerel sanal konakları kullanacak şekilde ayarlayın


115

Apache veya Ngnix kullanarak her zaman, dosyama http://project1.locekledikten sonra .hoststarayıcının kullanmada sorun yaşamadığı gibi gerçek projelere dayalı geliştirme siteleri oluşturuyorum.

Bununla birlikte, http://project1.loc/post.jsonaynı URL'ye bir cURL isteği ( ) yapmaya çalıştığımda zaman aşımından başka hiçbir şey alamıyorum. CURL'nin özel ana bilgisayarlarımı önemsemediğini ve bilgileri için doğrudan bir ad sunucusuna gittiğini varsayıyorum.

Bunu nasıl düzeltebilirim?

GÜNCELLEME "HOST: http: //project1.loc " adlı özel bir başlık ayarlıyorum ve şimdi 400 hata alıyorum - ancak bunlar anlık oluyor, bu nedenle cURL'nin en azından hosts dosyasını kullandığını varsayıyorum ...

Yanıtlar:


428

Aslında curl'nin bunun için açıkça bir seçeneği vardır: --resolve

Onun yerine curl -H 'Host: yada.com' http://127.0.0.1/something

kullanım curl --resolve 'yada.com:80:127.0.0.1' http://yada.com/something

Aradaki fark nedir?

Diğerlerinin yanı sıra, bu HTTPS ile çalışır. Yerel sunucunuzun için bir sertifikası olduğunu varsayarsak, yada.comyukarıdaki ilk örnek başarısız olur çünkü yada.comsertifika 127.0.0.1URL'deki ana bilgisayar adıyla eşleşmez .

İkinci örnek HTTPS ile doğru şekilde çalışır.

Temelde, bir "Ana Bilgisayar" üstbilgisini iletmek -H, Ana Makinenizi üstbilgi kümesine kırar, ancak curl'nin ana bilgisayara özgü tüm zekasını atlar. Kullanmak --resolve, geçerli olan tüm normal mantığı kullanır, ancak DNS aramasının verileri komut satırı seçeneğinizde döndürdüğünü varsayar. Aynı şekilde çalışır/etc/hostsOlması gerektiği .

Not --resolvebir bağlantı noktası numarası alır, bu nedenle HTTPS için kullanırsınız

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


26
Bu beni öldürüyor - biri bunu doğru cevap olarak işaretleyebilir mi? Cevaptan çok daha yeni, bu yüzden oy yok .. ama kabul edilen cevap yanlış (yani, sadece belirli durumlarda işe yarıyor) = (
John Hart

Bu gerçekten harika bir cevap ve oyumu aldı. Yalnızca Xenocross bir yanıtı kabul edildi olarak işaretleyebilir. Zamanla diğerleri muhtemelen buraya gelecek ve sizinkini kademeli olarak daha yüksek oylar.
hobodave

10
--Resolve'un yalnızca curl 7.21.3'te eklendiğini belirtmek gerekir - eski bir ana bilgisayarda (örneğin Ubuntu 10.04 LTS) takılı kalırsanız, -H 'Ana Bilgisayar ...' seçeneği hala yararlı bir geri dönüştür.
Ken

9
Bunun muhtemelen kabul edilen cevap olması gerektiği konusunda hemfikir olsam da (ve tam tersine OP değiştirirse kesinlikle gücenmem), cevabımın yanlış olduğunu söylemek doğru değildir: o zaman mevcut olan versiyonlar için doğrudur soru ve cevap üretildi. SO kullanıcıları, ilk cevabın ötesini okumaktan rahatsız olmadığınız ve cevapları zaman damgalarına göre değerlendirdiğiniz kullanıcılar asla en iyi yardımı alamayacaklar ...
Bruno

1
Üzgünüm Bruno, alınacak bir şey yok.
John Hart

120

DÜZENLEME: Bu şu anda kabul edilen cevap olsa da, okuyucular bu diğer cevabı kullanıcı John Hart tarafından ihtiyaçlarına daha uygun bulabilirler . Ken kullanıcısına göre 7.21.3 sürümünde sunulan bir seçeneği kullanır ( Aralık 2010'da piyasaya sürüldü , yani bu ilk cevaptan sonra).


Düzenlenen sorunuzda, URL'yi ana bilgisayar adı olarak kullanıyorsunuz, ancak bunun yalnızca ana bilgisayar adı olması gerekiyor.

Deneyin:

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

nerede project1.locolduğunu sadece ana bilgisayar adını ve 127.0.0.1hedef IP adresidir.

(Komut satırında değil bir kitaplıktan curl kullanıyorsanız http://, Hostbaşlığı girmediğinizden emin olun .)


1
PHP ile 400 hata alıyorum ve curl.exe ile isteği manuel olarak yaptığımda sunucunun varsayılan dizinini alıyorum, bu da HOSTbaşlığa saygı göstermediği anlamına geliyor .
Xeoncross

Sanal ana bilgisayarlara sahip çeşitli sunucularda denedim ve çalışıyor (komut satırından). Deneyin Hostdeğil HOST(Ben küçük harf duyarlı olması gerektiğini düşünüyorum rağmen) her ihtimale karşı. Dediğim gibi, Hostbaşlıkta yalnızca ana bilgisayar adını kullandığınızdan emin olun , başka hiçbir şey (hayır http://ve /somethingsonrasında). Hosts dosyanızı nasıl kurdunuz?
Bruno

Bunu yapmanın sonuçlarıyla ilgili daha fazla veri aşağıda yayınlandı.
Xeoncross

1
Bruno'nun aşağıda söylediği gibi, sorun muhtemelen istek yapıyor ve 403 hatası alıyor gibi göründüğü için benim sunucu yapılandırmamdan kaynaklanıyor.
Xeoncross

Host dosyasındaki "127.0.0.1 myvirtualhost.localhost" dosyasını kaçırdım, bu yüzden sorun.
Arvind K.

2

Uygun hosts dosyasını dev.yourdomain.comişaret eden gerçek bir tam nitelikli etki alanı adı (gibi ) kullanın 127.0.0.1veya düzenlemeyi deneyin (genellikle * nix ortamlarında / etc / hosts).


Windows üzerinde geliştiriyorumsystem32/drivers/etc/hosts
Xeoncross

CURL'nin yerel yapısını mı yoksa bazı cygwin çapraz derlemesini mi kullanıyorsunuz? Bunu söylüyorum çünkü her birinin DNS'lerini nasıl çözdüğünden emin değilim. Yerel , Windows'un ana bilgisayar dosyasından almalıdır , ancak bir cygwin sürümü bir cygwin sürümü isteyebilir. Her iki durumda da, 127.0.0.1'e işaret eden gerçek bir alan adı kullanmak, işler nasıl yapılırsa yapılsın işe yarar.
Oli

Windows için PHP 5.3'te bulunan yerel pencere yapısını kullanıyorum (php_fastcgi olarak çalışıyor).
Xeoncross

2

Görünüşe göre bu nadir bir sorun değil.

Önce bunu kontrol edin .

Bu işe yaramazsa, aşağıdaki gibi Windows bir yerel DNS sunucusunu yükleyebilirsiniz bu . Windows'u, DNS sunucusu olarak localhost'u kullanacak şekilde yapılandırın. Bu sunucu, ihtiyacınız olan sahte etki alanları için yetkili olacak ve diğer tüm istekler için istekleri gerçek DNS sunucularına iletecek şekilde yapılandırılabilir.

Şahsen bunun biraz abartılı olduğunu düşünüyorum ve hosts dosyasının neden çalışmadığını anlayamıyorum. Ancak yaşadığınız sorunu çözmelidir. Normal DNS sunucularınızı da ileticiler olarak kurduğunuzdan emin olun.


Lütfen kendi cevabınızı okuyup yeniden yazabilir misiniz? Üçüncü satırdaki İngilizce hiçbir anlam ifade etmiyor!
OmarOthman

Derli toplu. Sanırım doğru okumadan çok hızlı yazdım.
Matt

1

Sunucu istekleri gerçekten alıyor mu ve ana bilgisayar adını (diğer adı) doğru şekilde işliyor musunuz?

.hosts dosyama ekledikten sonra

İsteğin nasıl geldiğini görmek için web sunucusu günlüğünüzü kontrol edin ...

curl, gönderilen isteği dökmek için seçeneklere sahiptir ve alınan yanıt, bir dosyaya kaydedilecek olan iz olarak adlandırılır.

--trace

Ana bilgisayar veya başlık bilgileriniz eksikse, bu başlıkları yapılandırma seçeneği ile zorlayabilirsiniz.

Curl isteğini komut satırında çalıştırır ve sonra PHP'de uygulamaya çalışırdım.

yapılandırma seçeneği

-K / - yapılandırma

curl ile ilgili seçenekler burada

--trace Açıklayıcı bilgiler dahil tüm gelen ve giden verilerin tam izleme dökümünü verilen çıktı dosyasına etkinleştirir. Çıktının stdout'a gönderilmesi için dosya adı olarak "-" kullanın.

      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 argümanlarının hangi yapılandırma dosyasından okunacağını belirtir. Yapılandırma dosyası, komut satırı argümanlarının yazılabildiği ve daha sonra gerçek komut satırına yazılmış gibi kullanılabilecek bir metin dosyasıdır. Seçenekler ve parametreleri aynı yapılandırma dosyası satırında beyaz boşluk, iki nokta üst üste, eşittir işareti veya bunların herhangi bir kombinasyonuyla ayrılmış olarak belirtilmelidir (ancak, tercih edilen ayırıcı eşittir işaretidir). Parametre boşluk içerecekse, parametre tırnak içine alınmalıdır. Çift tırnak içinde, aşağıdaki kaçış dizileri mevcuttur: \, \ ", \ t, \ n, \ r ve \ v. Diğer herhangi bir harfin önündeki ters eğik çizgi yok sayılır. Yapılandırma satırının ilk sütunu bir '#' ise karakter, satırın geri kalanı yorum olarak değerlendirilecektir.

      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.

Yine, nginx çalıştıran aynı pencerelerdeki bir sankondan bir sayfa getirmek için Windows üzerinde PHP kullanıyorum. Her neyse, bir vhost'a bir istekte bulundum http://domain.loc/users/getSettings.xmlve bu access.log'un gösterdiği 127.0.0.1 - - [09/Aug/2010:11:42:55 -0500] "POST /users/getSettings.xml HTTP/1.1" 499 0 "-" "-"ve curl'nin bildirdiği şeydi. Operation timed out after 10000 milliseconds with 0 bytes received Sanırım access.log isteği gösterdiğinden , cURL aslında vhost'u işliyor. Sonra tekrar, şimdi doğru etki alanına yapıyor olabilir ...
Xeoncross

Bu satırdaki "499 0" ÇOK anlamlıdır. İşlem, curl'nin beklediği sıfır bayt döndürdü. ve bir HTTP 499 döndürdü - bu garip bir sonuç. gönderiye yanıt olarak statik bir dize döndüren başka bir komut dosyası çağırın ve yanıtı curl olarak aldığınızı görün. Pek çoğunuz verileri beklediğiniz gibi göndermiyorsunuz ... ve komut dosyası yanıt beklerken zaman aşımına uğruyor olabilir. ayrıca, girdiyi geçici bir dosyaya kaydetmek için komut dosyasını değiştirin ve "curl isteğinizden beklenen postayı aldığınızı" görün
George Lambert

Ekle komut satırı curl'yi denediniz mi - böylece gönderiyi kontrol edebilir ve sunucu yanıtını görebilirsiniz?
George Lambert

İkinci soruya hızlı cevap - hayır. Windows terminalinde değil PHP'de yerleşik olduğundan, Windows'ta cURL komut satırına nasıl erişeceğimi bilmiyorum.
Xeoncross

1
Windows için curl komut satırı sürümünü buradan indirebilirsiniz curl.haxx.se/download.html
George Lambert

1

İçin bir talepte bulunmak

C:\wnmp\curl>curl.exe --trace-ascii -H 'project1.loc' -d "uuid=d99a49d846d5ae570
667a00825373a7b5ae8e8e2" http://project1.loc/Users/getSettings.xml

Aşağıdakileri -Hiçeren günlük dosyasında sonuçlandı :

== 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 dosyam şöyle görünüyor:

# 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
-Htam başlık içindir, sadece ana bilgisayar için değil, bu yüzden kullanın -H 'Host: project1.loc'. Ayrıca, bu soruna rağmen, bu istek doğru ana bilgisayarda çalışıyor gibi görünüyor ( hostsen azından komut satırında curl ile dosyanızdan doğru bir şekilde alınmış ). Ne çalışmıyor (403) bir kimlik doğrulama / yetkilendirme sorunu gibi görünüyor, bu nedenle sunucunuz bu istekleri engelliyor gibi görünüyor. Bunun için sunucu yapılandırmasını düzeltmenizi öneririm.
Bruno

0

Henüz DNS aracılığıyla bağlanmamış Apache http sunucularında sanal ana bilgisayarlar kurmak için şunu kullanmayı seviyorum:

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

Host-name, web sunucusunun çalıştığı makinenin IP adresi veya DNS adıdır. Bu aynı zamanda https-Siteleri için de işe yarar.


1
Bu gönderi 10 yıl önce gönderildi ve yorumlarla düzeltildi, katkılarınız için teşekkürler. Bu tür gönderilerde lütfen yanıtları kontrol edin, bir asnwear varsa oy gönderin, aksi takdirde spam olarak işaretlenebileceğiniz için yeni yanıt gönderin.
samuhay
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.