ローカル仮想ホストを使用するようにcURLを設定する


115

ApacheまたはNgnixを使用して、実際のプロジェクトに基づいた開発サイトを常に作成http://project1.locしてい.hostsます。ファイルを追加した後、ブラウザーは問題なく使用できます。

ただし、http://project1.loc/post.json同じURLにcURLリクエスト()を行おうとすると、タイムアウト以外は何も表示されません。私は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.comyada.com証明書が127.0.0.1URLのホスト名と一致しないため、上記の最初の例は失敗します。

2番目の例はHTTPSで正しく動作します。

本質的に、経由で「ホスト」ヘッダーを渡すと-H、ヘッダーセットにホストがハッキングされますが、curlのホスト固有のインテリジェンスはすべてバイパスされます。を使用--resolveすると、適用されるすべての通常のロジックが活用されますが、DNSルックアップがコマンドラインオプションでデータが返されたように見せかけるだけです。正常に動作し/etc/hostsます。

--resolveはポート番号を取るため、HTTPSの場合は

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


26
これは私を殺している-誰かがこれを正しい答えとしてマークしてもらえますか?それは答えよりもはるかに新しいので、投票はありません..しかし、受け入れられた答えは間違っています(つまり、特定の状況でのみ機能します)=(
John Hart

これは確かに素晴らしい答えであり、私の投票を受けました。Xenocrossのみが回答を承認済みとしてマークできます。やがて他の人たちがここに来て、徐々にあなたのものを高く投票するでしょう。
hobodave 2012年

10
--resolveはcurl 7.21.3でのみ追加されたことに注意する価値があります。古いホスト(Ubuntu 10.04 LTSなど)でスタックしている場合、-H 'Host ...'オプションは依然として有用なフォールバックです。
ケン

9
私はこれがおそらく受け入れられる答えであるべきであることに同意します(そして、OPがそれを変更した場合は、逆に私は確かに腹を立てません)、私の答えは間違っていると言ってはいけません:現時点で利用可能なバージョンに対して正しいです質疑応答が作成されました。最初の回答を読んでわざわざ読むことも、タイムスタンプに基づいて回答を評価することもできないSOユーザーは、最高の助けにはなりません...
Bruno

1
申し訳ありません、ブルーノ、攻撃は意味していません。
John Hart

120

編集:これは現在受け入れられている回答ですが、読者はユーザーJohn Hartによるこの別の回答をニーズにさらに適合させる可能性があります。ユーザーKenによると、バージョン7.21.3(2010年12月リリースされた、つまりこの最初の回答の後)で導入されたオプションを使用します。


編集した質問では、URLをホスト名として使用していますが、URLはホスト名のみである必要があります。

試してください:

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

ここで、project1.loc単なるホスト名で、127.0.0.1はターゲットIPアドレスです。

(ライブラリからcurlを使用していて、コマンドラインでは使用していない場合はhttp://Hostヘッダーに入力しないでください。)


1
PHPで400エラーが発生し、curl.exeで手動でリクエストを送信すると、サーバーのデフォルトインデックスが取得されます。これは、HOSTヘッダーが考慮されないことを意味します。
Xeoncross

仮想ホストを備えたさまざまなサーバーで試してみましたが、(コマンドラインから)機能します。念のHostため試してみてくださいHOST(大文字と小文字は区別されません)。先ほど述べたように、Hostヘッダーにはホスト名のみを使用し、それ以外は使用しないようにしてください(後は使用http://しない/somethingでください)。どのようにhostsファイルを設定しましたか?
Bruno

これを実行した結果についての詳細なデータを以下に投稿しました。
Xeoncross

1
Brunoが以下に言ったように、リクエストがそれを作成して403エラーを受け取っているように見えるので、問題はおそらく私のサーバー設定にあるだけです。
Xeoncross 2010

hostsファイルで「127.0.0.1 myvirtualhost.localhost」を逃したため、問題が発生しました。
Arvind K.

2

dev.yourdomain.comを指す実際の完全修飾ドメイン名(など)を使用するか127.0.0.1、適切なホストファイル(通常は* nix環境の/ etc / hosts )を編集してみてください。


私が使用してWindows上で開発system32/drivers/etc/hosts
Xeoncross

cURLのネイティブビルドまたは一部のcygwinクロスビルドを使用していますか?それぞれがDNSを解決する方法がわからないので、これを言います。ネイティブ Windowsのhostsファイルからピックアップする必要がありますが、cygwinバージョンではcygwinバージョンが必要になる場合があります。どちらの方法でも、127.0.0.1を指す実際のドメインを使用すると機能しますが、設定はされています。
Oli

PHP 5.3 for windows(php_fastcgiとして実行)に含まれているネイティブのWindowsビルドを使用しています。
Xeoncross 2010

2

これは珍しい問題ではないようです。

小切手 まずこれを

それでも問題が解決しない場合は、WindowsにローカルDNSサーバーをインストールできます。 、この。localhostをDNSサーバーとして使用するようにWindowsを構成します。このサーバーは、必要なすべての偽のドメインに対して権限を持ち、他のすべての要求について要求を実際のDNSサーバーに転送するように構成できます。

私は個人的にはこれはやや上にあり、hostsファイルが機能しない理由を理解できません。しかし、それはあなたが抱えている問題を解決するはずです。通常のDNSサーバーもフォワーダーとして設定してください。


自分の答えを読んで書き直していただけませんか?3行目の英語は意味がありません。
OmarOthman 2017

片付け。ああ、私はそれを適切に読まずに速く入力したと思います。
マット

1

サーバーは実際にリクエストを取得しますか?ホスト名(エイリアス)を適切に処理していますか?

.hostsファイルに追加した後

ウェブサーバーのログをチェックして、リクエストがどのように受信されたかを確認します...

curlには、送信された要求と受信された応答をダンプするオプションがあります。これはトレースと呼ばれ、ファイルに保存されます。

- 痕跡

ホストまたはヘッダー情報が不足している場合-configオプションでそれらのヘッダーを強制できます。

コマンドラインでcurlリクエストを機能させてから、PHPでの実装を試みます。

設定オプションは

-K /-config

カールに関連するオプションはここにあります

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

繰り返しますが、nginxを実行している同じウィンドウのvhostでページをフェッチするために、ウィンドウでPHPを使用しています。とにかく、私は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 "-" "-"、curlが報告したものOperation timed out after 10000 milliseconds with 0 bytes received です。その後、再び正しいドメインに
到達

その行の "499 0"は非常に重要です。プロセスは0バイトを返しました-どのカールが待機していたか。そして、奇妙な結果であるHTTP 499を返しました。別のスクリプトを呼び出し(投稿に応答して静的文字列を返します)、curlで応答を取得していることを確認します。多くの場合、期待どおりにデータを投稿していません...スクリプトが応答を待機してタイムアウトしている可能性があります。また、スクリプトを変更して、入力を一時ファイルに記録し、「curlリクエストから期待される投稿を受け取っている」ことを確認します
George Lambert

さらに、コマンドラインcurlを試してみました-投稿を制御してサーバーの応答を確認できるようにするには?
ジョージ・ランバート

2番目の質問に対する素早い回答-いいえ。コマンドラインcURLはWindowsターミナルではなくPHPに組み込まれているため、Windowsでコマンドラインにアクセスする方法がわかりません。
Xeoncross 2010


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少なくともコマンドラインでcurlを使用してファイルから正しく取得されます)。機能していないもの(403)は認証/承認の問題のようですので、サーバーはこれらのリクエストをブロックしているようです。このためにサーバー構成を修正することをお勧めします。
ブルーノ

0

DNSを介してまだ接続されていないApache httpサーバーで仮想ホストを設定するには、次のように使用します。

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

host-nameは、Webサーバーが実行されているマシンのIPアドレスまたはDNS名です。これは、https-Sitesでもうまく機能します。


1
この投稿は10年前に送信され、コメントに基づいて修正されました。この種の投稿では、回答を確認してください。asnwearがある場合は、投票を送信してください。スパムとしてマークされている可能性があるため、新しい回答を投稿してください。
サムハイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.