web-dev-qa-db-ja.com

file_get_contents-ストリームのオープンに失敗しました:HTTP要求が失敗しました! HTTP / 1.1 404が見つかりません

サイトを新しいドメインに移動した後、file_get_contentsで奇妙な問題が発生しています。新しいSSL証明書を機能させるには、(Pleskを使用して)新しいドメインとIPアドレスを設定する必要がありました。これで、同じドメインでスクリプトを呼び出すfile_get_contentsから次のことがわかります。

ストリームを開けませんでした:HTTPリクエストに失敗しました! HTTP/1.1 404が見つかりません

別のサーバーでfile_get_contentsを使用して同じURLを呼び出すと正常に動作し、失敗したサーバーからwww.google.comを呼び出すと動作するので、同じサーバーでURLを呼び出すだけのようです!

I file_get_contents /サーバーのサーバーの(インデックスページ)からサーバーの2つの異なるSSL証明書を持つ2つのIPを持つことに関係があるかもしれないと感じています私はplesk「これは新しいドメインです」ページを取得しますそのため、Apacheは、自身のサーバーから呼び出されたときに適切な仮想ホストを検索しません。

明確にするには(うまくいけば!):

ドメインをホストしているサーバー上:

file_get_contents('https://mydomain.com?limit=4&offset=0&s_date=2012-02-05&e_date=2012-03-13&order=release_date&dir=desc&cid=12');

「ストリームのオープンに失敗しました:HTTPリクエストに失敗しました!HTTP/1.1 404 Not Found」

file_get_contents('http://www.google.com');

正しく動作します

別のサーバー上:

file_get_contents('https://mydomain.com?limit=4&offset=0&s_date=2012-02-05&e_date=2012-03-13&order=release_date&dir=desc&cid=12');

正常に動作します。

Sslをオフにしようとしましたが、まだ同じ問題が発生します。

16
user1250758

自宅の小さなテストサーバーで作業しているときにも、この問題が発生しました。ドメイン名は外部IPアドレスに解決され、リクエストが送信されます。ただし、リクエストはネットワーク内から送信されるため、ルーターはリクエストを通常のリクエストとして認識しません。おそらく、それを構成するためのWebインターフェースがあり、独自の管理システムからページを返そうとしますが、指定したパスでは見つかりません。

その場合、私はWindows PCで作業していたので、テストしているドメインをhostsファイルに追加し、IPアドレス(またはサーバー(同じネットワーク内の別のマシンの場合)。 Linuxでも同様の解決策があるはずです。

問題はPHPまたはサーバーではなく、ルーターです。

6
GolezTrol

ほとんどのホスティングは、file_get_contents()を使用して外部URLからデータをロードできる_furl_open_パラメーターをブロックするようになりました。

[〜#〜] curl [〜#〜] または Guzzle のようなPHPクライアントライブラリを使用できます。

警告を処理するだけが必要な場合(URLが見つからない場合)、 Warnings Exceptions

set_error_handler(
  function ($err_severity, $err_msg, $err_file, $err_line, array $err_context) {
    // do not throw an exception if the @-operator is used (suppress)
    if (error_reporting() === 0) return false;

    throw new ErrorException( $err_msg, 0, $err_severity, $err_file, $err_line );
  },
  E_WARNING
);
try {
  $contents = file_get_contents($your_url);
} catch (Exception $e) {
  echo $e->getMessage();
}
restore_error_handler();

これに基づく解決策 thread/question

1
CPHPython

これを試してみてください:

file_get_contents('https://mydomain.com?'.urlencode('limit=4&offset=0&s_date=2012-02-05&e_date=2012-03-13&order=release_date&dir=desc&cid=12'));
0
Abdelali AHBIB