私はwp_remote_get()
を使ってウェブからさまざまなページを取得しています。ニュースサイトです。
ほとんどの場合、これはうまく機能します。ただし、要求が成功(コード200)を返すことがありますが、そのページのコンテンツは、ブラウザで取得されたページとは異なります(この呼び出しで返されるページのコンテンツは、 "ページが見つかりません"という行に沿っています。 「)
ただし、問題のページを取得するためにブラウザを使用した場合、そのページは正常に返されます。
これが一例です。
// The following returns code 200, yet the returned page is different from the acual page that is accessed via the browser
wp_remote_get("http://www.aljazeera.net/news/international/2016/8/24/%D9%82%D8%AA%D9%84%D9%89-%D9%88%D8%AF%D9%85%D8%A7%D8%B1-%D8%A8%D8%B2%D9%84%D8%B2%D8%A7%D9%84-%D9%8A%D8%B6%D8%B1%D8%A8-%D9%88%D8%B3%D8%B7-%D8%A5%D9%8A%D8%B7%D8%A7%D9%84%D9%8A%D8%A7");
注:確認のために、私はPHPを介して返されたページとブラウザ経由でそのページのソースコードを見ましたが、それらは異なります。
何が問題なのかわかりません。私はそれがwp_remote_get()
の引数でやるのが差し迫っているかもしれないと疑っています、しかし、 ドキュメンテーション 引数については明確ではありません。
それは議論ですか?もしそうなら、何をどのように設定するのですか?そうでない場合、あなたはその問題をどう思いますか?
zendka のコメントを読んだ後、 " 私は全く同じ内容になります。もう一度調べて、レスポンスボディをブラウザのページソースと比較しました。それらは同じです:) 「非常に重要なことに気づいた。
wp_remote_get()
の私のコードで使用されていた元のURLはhttp://www.aljazeera.net/news/international/2016/8/24/قتلى-ودمار-بزلزال-يضرب-وسط-إيطاليا
です。
そして電話は
// Causes problems
wp_remote_get("http://www.aljazeera.net/news/international/2016/8/24/قتلى-ودمار-بزلزال-يضرب-وسط-إيطاليا");
この質問で使用され、もともと説明されているURLは
// Runs successfully
wp_remote_get("http://www.aljazeera.net/news/international/2016/8/24/%D9%82%D8%AA%D9%84%D9%89-%D9%88%D8%AF%D9%85%D8%A7%D8%B1-%D8%A8%D8%B2%D9%84%D8%B2%D8%A7%D9%84-%D9%8A%D8%B6%D8%B1%D8%A8-%D9%88%D8%B3%D8%B7-%D8%A5%D9%8A%D8%B7%D8%A7%D9%84%D9%8A%D8%A7");
次の点に注意してください:
問題やエラーを発生させずにwp_remote_get()
と連携させるためには、http://www.aljazeera.net/news/international/2016/8/24/قتلى-ودمار-بزلزال-يضرب-وسط-إيطاليا
の形式ではなく、http://www.aljazeera.net/news/international/2016/8/24/%D9%82%D8%AA%D9%84%D9%89-%D9%88%D8%AF%D9%85%D8%A7%D8%B1-%D8%A8%D8%B2%D9%84%D8%B2%D8%A7%D9%84-%D9%8A%D8%B6%D8%B1%D8%A8-%D9%88%D8%B3%D8%B7-%D8%A5%D9%8A%D8%B7%D8%A7%D9%84%D9%8A%D8%A7
のようにエンコードする必要があります。
wp_remote_get()
がhttp://www.aljazeera.net/news/international/2016/8/24/قتلى-ودمار-بزلزال-يضرب-وسط-إيطاليا
と連携できないのは、このutf8フォーマットに対応できないからです。これが正しく動作するためには、urlのパスのみをパーセントエンコード形式に変換する必要があります。さらに、パス内のスラッシュ(/)文字はエンコードしないでください。そうしないと、wp_remote_get()
がページを見つけることができなくなるため、404ページの内容で成功コード(200)が得られます。したがって、このフォーマットhttp://www.aljazeera.net/news/international/2016/8/24/%D9%82%D8%AA%D9%84%D9%89-%D9%88%D8%AF%D9%85%D8%A7%D8%B1-%D8%A8%D8%B2%D9%84%D8%B2%D8%A7%D9%84-%D9%8A%D8%B6%D8%B1%D8%A8-%D9%88%D8%B3%D8%B7-%D8%A5%D9%8A%D8%B7%D8%A7%D9%84%D9%8A%D8%A7
は、wp_remote_get()
に渡されると正しく機能します。
フォーマットを誤って報告したのは、私がテストしている最中で、FirefoxからURLをコピーしてここに貼り付けたためです。 Firefoxはフォーマットを自動的に「正しい」フォーマットに変換します。詳細はこちら: https://superuser.com/questions/480692/copying-unicode-symbols-from-firefox-address-bar-as-is
解決策
URLのパーセンテージ形式が正しいことを確認してください
wp_remote_get()
で新しくフォーマットされたURLを使う
役に立つリソース
https://github.com/neitanod/forceutf8
https://stackoverflow.com/questions/910793/detect-encoding-and-make-everything-utf-8
https://stackoverflow.com/questions/2742852/unicode-characters-in-urls
https://stackoverflow.com/questions/25465114/php-str-replace-not-working-with-special-chars
wp_remote_get()
によって送信されるHTTPリクエストは、ブラウザが送信するものとは異なります。例えばuser-agent
は違います( documentation を参照)。いくつかのウェブサイトはこれに基づいて異なって反応します。 wp_remote_get()
の2番目の引数はリクエストを変更することを可能にします。
Webサイトは、IPまたは受信した要求の数に応じて(通常は特定のパターンを制限または禁止することによって)応答が異なる場合があります。
ところで、私はあなたが言及したページをテストしました、そしてそれは私のために働きます:
wp_remote_get("http://www.aljazeera.net/news/international/2016/8/24/%D9%82%D8%AA%D9%84%D9%89-%D9%88%D8%AF%D9%85%D8%A7%D8%B1-%D8%A8%D8%B2%D9%84%D8%B2%D8%A7%D9%84-%D9%8A%D8%B6%D8%B1%D8%A8-%D9%88%D8%B3%D8%B7-%D8%A5%D9%8A%D8%B7%D8%A7%D9%84%D9%8A%D8%A7");