たとえば、次のようなWebページをダウンロードしようとしています。
http://www.site.com/savings/thispage?OneId=88&SecondId=185
このページでCURLが失敗しています。アンパサンドが原因だと思います。このアンパサンドをエスケープしてダウンロードを完了するにはどうすればよいですか?
エラーはUnable to resolve host
たとえば、次のようなWebページをダウンロードしようとしています。
http://www.site.com/savings/thispage?OneId=88&SecondId=185
このページでCURLが失敗しています。アンパサンドが原因だと思います。このアンパサンドをエスケープしてダウンロードを完了するにはどうすればよいですか?
エラーはUnable to resolve host
あなたが次のようなことをしているなら
<?php
$url = "http://www.site.com/savings/thispage?OneId=88&SecondId=185";
$encoded = urlencode($url);
// use cURL to fetch $encoded
?>
次に、文字通りcURLにフェッチを要求していますhttp%3A%2F%2Fwww.site.com%2Fsavings%2Fthispage%3FOneId%3D88%26SecondId%3D185
。ホスト名を要求パスから区切る「/」文字がないため、これはホスト名として扱われています。
どのようにcURLを起動していますか?PHPライブラリを使用していますか、それともまたはのようなものを実行していますsystem()
かshell_exec()
?起動方法によっては、別の方法で(またはまったくエスケープしないで)エスケープする必要がある場合があります。
実際にコマンドラインから(PHPからではなく)実行している場合は、次のようなものでうまくいくはずです。
curl 'http://www.site.com/savings/thispage?OneId=88&SecondId=185'
url_encode();
とを見てくださいrawurlencode();
。
-_ を除くすべての英数字以外の文字を含む文字列を返します。パーセント (%) 記号に置き換えられ、その後に 2 つの 16 進数とプラス (+) 記号としてエンコードされたスペースが続きます。これは、WWW フォームから投稿されたデータがエンコードされるのと同じ方法でエンコードされます。つまり、application/x-www-form-urlencoded メディア タイプと同じ方法です。これは » RFC 3986 エンコーディング (rawurlencode() を参照) とは異なり、歴史的な理由から、スペースはプラス (+) 記号としてエンコードされます。
更新: エラーはであるため、ファイルのアクセス許可が であるUnable to resolve host
ことを確認してください。これにより、セキュリティが確保されるだけでなく、Apache/PHP がホスト名を読み取って解決できるようになります。/etc/resolv.conf
0644
PHP と Apache が DNS サービスにアクセスできるかどうかを確認するには、次の呼び出しを行います。gethostbyname();