Đặt cURL để sử dụng máy chủ ảo cục bộ


115

Sử dụng Apache hoặc Ngnix Tôi luôn tạo các trang web phát triển dựa trên các dự án thực như http://project1.locsau khi thêm vào .hoststệp của mình , trình duyệt không gặp vấn đề gì khi sử dụng.

Tuy nhiên, khi tôi cố gắng thực hiện một yêu cầu cURL ( http://project1.loc/post.json) cho cùng một URL đó, tôi không bao giờ nhận được bất cứ điều gì ngoài thời gian chờ. Tôi cho rằng cURL không quan tâm đến máy chủ tùy chỉnh của mình và truy cập thẳng vào máy chủ tên để biết thông tin.

Làm thế nào tôi có thể sửa lỗi này?

CẬP NHẬT Tôi đặt tiêu đề tùy chỉnh "HOST: http: //project1.loc " và bây giờ tôi đang gặp 400 lỗi - nhưng chúng là tức thời nên tôi giả sử rằng cURL ít nhất đang sử dụng tệp máy chủ ...

Câu trả lời:


428

Trên thực tế, curl có một tùy chọn rõ ràng cho việc này: --resolve

Thay vì curl -H 'Host: yada.com' http://127.0.0.1/something

sử dụng curl --resolve 'yada.com:80:127.0.0.1' http://yada.com/something

Sự khác biệt là gì, bạn yêu cầu?

Trong số những người khác, điều này hoạt động với HTTPS. Giả sử máy chủ cục bộ của bạn có chứng chỉ yada.com, ví dụ đầu tiên ở trên sẽ không thành công vì yada.comchứng chỉ không khớp với 127.0.0.1tên máy chủ trong URL.

Ví dụ thứ hai hoạt động chính xác với HTTPS.

Về bản chất, việc chuyển tiêu đề "Máy chủ" qua -Hsẽ hack Máy chủ của bạn vào bộ tiêu đề, nhưng bỏ qua tất cả trí thông minh dành riêng cho máy chủ của curl. Sử dụng --resolveđòn bẩy tất cả các logic thông thường áp dụng, nhưng chỉ cần giả vờ tra cứu DNS đã trả về dữ liệu trong tùy chọn dòng lệnh của bạn. Nó hoạt động giống như /etc/hostsnên.

Lưu ý --resolvelấy số cổng, vì vậy đối với HTTPS bạn sẽ sử dụng

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


26
Điều này đang giết chết tôi - ai đó có thể vui lòng đánh dấu đây là câu trả lời đúng không? Nó mới hơn nhiều so với câu trả lời, vì vậy không có phiếu bầu .. nhưng câu trả lời được chấp nhận là sai (nghĩa là chỉ hoạt động trong một số tình huống nhất định) = (
John Hart

Đây thực sự là một câu trả lời tuyệt vời, và đã nhận được phiếu bầu của tôi. Chỉ Xenlon mới có thể đánh dấu một câu trả lời là được chấp nhận. Trong thời gian những người khác có thể sẽ đến đây và dần dần bỏ phiếu của bạn cao hơn.
hobodave

10
Đáng lưu ý rằng --resolve chỉ được thêm vào trong phiên bản 7.21.3 - nếu bạn bị kẹt trên máy chủ cũ hơn (ví dụ: Ubuntu 10.04 LTS) thì tùy chọn -H 'Host ...' vẫn là một dự phòng hữu ích.
Ken

9
Mặc dù tôi đồng ý rằng đây có lẽ là câu trả lời được chấp nhận (và tôi chắc chắn sẽ không vi phạm nếu OP thay đổi nó, ngược lại), nói rằng câu trả lời của tôi là sai không đúng: nó đúng cho các phiên bản có sẵn tại thời điểm đó câu hỏi và câu trả lời đã được tạo ra Người dùng SO bạn không thể bị làm phiền khi đọc câu trả lời đầu tiên và cũng đánh giá câu trả lời dựa trên dấu thời gian của họ sẽ không bao giờ nhận được sự trợ giúp tốt nhất ...
Bruno

1
Xin lỗi, Bruno, không có ý xúc phạm.
John Hart

120

EDIT: Mặc dù đây là câu trả lời hiện được chấp nhận, nhưng độc giả có thể tìm thấy câu trả lời khác này của người dùng John Hart thích nghi hơn với nhu cầu của họ. Nó sử dụng một tùy chọn, theo người dùng Ken , được giới thiệu trong phiên bản 7.21.3 (được phát hành vào tháng 12 năm 2010 , tức là sau câu trả lời ban đầu này).


Trong câu hỏi đã chỉnh sửa của bạn, bạn đang sử dụng URL làm tên máy chủ, trong khi đó chỉ cần là tên máy chủ.

Thử:

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

nơi project1.locchỉ tên máy chủ và 127.0.0.1là địa chỉ IP đích.

(Nếu bạn đang sử dụng curl từ một thư viện và không trên dòng lệnh, chắc chắn rằng bạn không đặt http://trong Hosttiêu đề.)


1
Tôi đang gặp 400 lỗi với PHP và khi tôi thực hiện yêu cầu bằng curl.exe theo cách thủ công, tôi nhận được chỉ mục mặc định của máy chủ, điều đó có nghĩa là nó không tôn trọng HOSTtiêu đề.
Xeoncross

Tôi đã thử nó trên nhiều máy chủ khác nhau với các máy chủ ảo và nó hoạt động (từ dòng lệnh). Cố gắng Hostkhông HOSTchỉ trong trường hợp (mặc dù tôi nghĩ rằng nó không nên phân biệt chữ hoa chữ thường). Như tôi đã nói, đảm bảo bạn chỉ sử dụng tên máy chủ trong Hosttiêu đề, không có gì khác (không http://và không có /somethingsau). Làm thế nào bạn thiết lập tập tin máy chủ của bạn?
Bruno

Đăng thêm dữ liệu về kết quả làm việc này dưới đây.
Xeoncross

1
Như Bruno đã nói bên dưới, vấn đề có lẽ chỉ là cấu hình máy chủ của tôi vì yêu cầu dường như đang thực hiện và nhận được lỗi 403.
Xeoncross

Tôi đã bỏ lỡ "127.0.0.1 myvirtualhost.localhost" trong tệp máy chủ do đó có vấn đề.
Arvind K.

2

Sử dụng tên miền thực sự đủ điều kiện (như dev.yourdomain.com) trỏ đến 127.0.0.1hoặc thử chỉnh sửa tệp máy chủ phù hợp (thường là / etc / hosts trong môi trường * nix).


Tôi phát triển trên windows bằng cách sử dụngsystem32/drivers/etc/hosts
Xeoncross

Bạn có đang sử dụng bản dựng của cURL hoặc một số bản dựng chéo của Cygwin không? Tôi nói điều này bởi vì tôi không chắc cách mỗi người giải quyết DNS của họ. Người bản địa nên chọn từ tệp máy chủ của Windows nhưng phiên bản cygwin có thể muốn có phiên bản cygwin. Dù bằng cách nào, sử dụng một tên miền thực trỏ đến 127.0.0.1 sẽ hoạt động tuy nhiên mọi thứ được thiết lập.
Oli

Tôi đang sử dụng bản dựng windows gốc đi kèm với PHP 5.3 cho windows (Chạy dưới dạng php_fastcgi).
Xeoncross

2

Có vẻ như đây không phải là một vấn đề hiếm gặp.

Kiểm tra cái này trước.

Nếu không được, bạn có thể cài đặt máy chủ DNS cục bộ trên Windows, chẳng hạn như cái này . Cấu hình Windows để sử dụng localhost làm máy chủ DNS. Máy chủ này có thể được cấu hình để có thẩm quyền cho bất kỳ tên miền giả nào bạn cần và để chuyển tiếp yêu cầu đến máy chủ DNS thực cho tất cả các yêu cầu khác.

Cá nhân tôi nghĩ rằng điều này hơi vượt trội và không thể hiểu tại sao tệp máy chủ không hoạt động. Nhưng nó sẽ giải quyết vấn đề bạn đang gặp phải. Hãy chắc chắn rằng bạn cũng thiết lập máy chủ DNS bình thường của mình làm giao nhận.


Bạn có thể vui lòng đọc câu trả lời của riêng bạn và viết lại nó? Tiếng Anh trong dòng thứ ba không có ý nghĩa!
OmarOthman

Được dọn dẹp. Trời ạ, đoán tôi đã gõ quá nhanh mà không đọc đúng.
Matt

1

Máy chủ có thực sự nhận được yêu cầu không và bạn có xử lý đúng tên máy chủ (bí danh) không?

sau khi thêm vào tập tin .hosts của tôi

Kiểm tra nhật ký máy chủ web của bạn, để xem yêu cầu đến như thế nào ...

curl có các tùy chọn để kết xuất yêu cầu đã gửi và phản hồi nhận được, nó được gọi là dấu vết, sẽ được lưu vào một tệp.

- dấu vết

Nếu bạn thiếu thông tin máy chủ hoặc tiêu đề - bạn có thể buộc các tiêu đề đó bằng tùy chọn cấu hình.

Tôi sẽ nhận được yêu cầu curl làm việc trên dòng lệnh, và sau đó thử thực hiện trong PHP.

tùy chọn cấu hình là

-K / - cấu hình

các tùy chọn có liên quan trong curl ở đây

--trace Cho phép kết xuất theo dõi đầy đủ tất cả dữ liệu đến và đi, bao gồm thông tin mô tả, vào tệp đầu ra đã cho. Sử dụng "-" làm tên tệp để gửi đầu ra đến thiết bị xuất chuẩ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 Chỉ định tệp cấu hình nào để đọc các đối số curl từ đó. Tệp cấu hình là một tệp văn bản trong đó các đối số dòng lệnh có thể được viết và sau đó sẽ được sử dụng như thể chúng được ghi trên dòng lệnh thực tế. Các tùy chọn và tham số của chúng phải được chỉ định trên cùng một dòng tệp cấu hình, được phân tách bằng khoảng trắng, dấu hai chấm, dấu bằng hoặc bất kỳ kết hợp nào của chúng (tuy nhiên, separa ưa thích là dấu bằng). Nếu tham số là để chứa khoảng trắng, tham số phải được đặt trong dấu ngoặc kép. Trong dấu ngoặc kép, các chuỗi thoát sau đây có sẵn: \, \ ", \ t, \ n, \ r và \ v. Dấu gạch chéo ngược trước bất kỳ chữ cái nào khác bị bỏ qua. Nếu cột đầu tiên của dòng cấu hình là '#' nhân vật, phần còn lại của dòng sẽ được coi là một nhận xét.

      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.

Một lần nữa, tôi đang sử dụng PHP trên windows để tìm nạp một trang trên vhost trên cùng các cửa sổ đang chạy nginx. Dù sao, tôi đã yêu cầu một vhost http://domain.loc/users/getSettings.xmlvà đây là những gì access.log đã trình bày 127.0.0.1 - - [09/Aug/2010:11:42:55 -0500] "POST /users/getSettings.xml HTTP/1.1" 499 0 "-" "-"và curl đã báo cáo Operation timed out after 10000 milliseconds with 0 bytes received Vì vậy tôi đoán rằng cURL thực sự đang xử lý vhost vì access.log hiển thị yêu cầu. Sau đó, một lần nữa, giờ đây nó có thể được chuyển đến đúng miền ...
Xeoncross

"499 0" trên dòng đó RẤT đáng kể. Quá trình trả về byte không - điều mà curl đang chờ. và trả về HTTP 499 - đó là một kết quả lạ. gọi một tập lệnh khác - trả về một chuỗi tĩnh để phản hồi bài đăng - và thấy rằng bạn đang nhận được phản hồi trong curl. Nhiều người không đăng dữ liệu như bạn mong đợi ... và tập lệnh có thể sắp hết thời gian chờ phản hồi. đồng thời thay đổi tập lệnh để ghi nhật ký đầu vào vào tệp tạm thời và thấy rằng bạn đang "nhận được bài đăng mong đợi từ yêu cầu curl của bạn"
George Lambert

Thêm bạn đã thử cuộn dòng lệnh - để bạn có thể kiểm soát bài đăng và xem phản hồi của máy chủ?
George Lambert

Trả lời nhanh câu hỏi thứ hai - không. Tôi không biết cách truy cập dòng lệnh cURL trên windows vì nó được tích hợp vào PHP và không phải là thiết bị đầu cuối của windows.
Xeoncross

1
bạn có thể tải xuống phiên bản dòng lệnh curl cho windows từ đây curl.haxx.se/doad.html
George Lambert

1

Yêu cầu

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

Kết quả trong -Htệp nhật ký chứa:

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

Tệp máy chủ của tôi trông như:

# 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
-Hlà cho tiêu đề đầy đủ, không chỉ máy chủ lưu trữ, vì vậy sử dụng -H 'Host: project1.loc'. Ngoài ra, mặc dù có vấn đề này, yêu cầu này dường như hoạt động trên máy chủ chính xác (lấy chính xác từ hoststệp của bạn bằng cách cuộn tròn trên dòng lệnh ít nhất). Những gì không hoạt động (403) có vẻ như là một vấn đề xác thực / ủy quyền, vì vậy máy chủ của bạn dường như đang chặn các yêu cầu này. Tôi khuyên bạn nên sửa cấu hình máy chủ cho việc này.
Bruno

0

Để thiết lập máy chủ ảo trên máy chủ http của Apache chưa được kết nối qua DNS, tôi muốn sử dụng:

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

Trong đó tên máy chủ là địa chỉ IP hoặc tên DNS của máy mà máy chủ web đang chạy. Điều này cũng hoạt động tốt cho các trang web https.


1
Bài đăng này đã được gửi 10 năm trước và cố định thông qua ý kiến, cảm ơn sự đóng góp. Trong loại bài đăng này, vui lòng kiểm tra câu trả lời, nếu có asnwear gửi phiếu bầu khác đăng câu trả lời mới vì bạn có thể bị đánh dấu là spam.
samuhay
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.