2

私はJavaScriptとPHPで書かれた小さなツールを持っています。このツールは、URLのリストを取得し、それらすべてのHTTPステータスコードをチェックします。curlを使用して実際のステータスを確認します。
私が素敵なURLを持っている限り、それはうまく機能します。®が含まれているURLに問題があります。ツールが返さ404れるはずだとわかったときに、ツールが返されます301

私の推測では、この「®」はのようなものに変換されて%C2おり、問題を引き起こしていると思います。

これと同じURLをここに貼り付けると、正常に返されるため、実行できることはわかっています301

私のPHPカールは次のようになります。

        ...
        if (($curl = curl_init()) == false) {
            throw new Exception('curl_init error for url '.$_POST['url'].'.');
        }
        $header[] = "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
        $header[] = "Cache-Control: max-age=0";
        $header[] = "Connection: keep-alive";
        $header[] = "Keep-Alive: 300";
        $header[] = "Accept-Charset: iso-8859-1,utf-8;q=0.7,*;q=0.7";
        $header[] = "Accept-Language: en-US;q=0.5";
        $header[] = "Pragma: ";
        
        curl_setopt($curl, CURLOPT_URL, $_POST['url']);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        curl_setopt($curl, CURLOPT_NOBODY, true);
        curl_setopt($curl, CURLOPT_AUTOREFERER, true);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 50);
        $Cresponse = curl_exec($curl); // execute the curl command
        $response['callback']['data'] = $http_status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        curl_close($curl);
        ...

使用しようとしましたが、これはURL全体をtourldecode()とともにエンコードします。http://http%3A%2F%2F

この®が問題を引き起こしている理由はありますか?

4

3 に答える 3

0

parse_url()と、、、およびを使用しurlencode()ます。pathqueryfragment

次に、エンコードされたURLを再構築し、リクエストを行います。

$url = parse_url ($_POST['url']);
if ($url === FALSE) {
    /* error handling */
}
$encoded_url = $url['scheme'] . "://" .
               $url['host']   .
               urlencode ($url['path])     . "?"   .
               urlencode ($url['query])    . "#"   .
               urlencode ($url['fragment])
于 2012-08-01T13:05:21.700 に答える
0

Javascript側では、次のencodeURIような関数を使用してURLをエスケープする必要があります。

// results in "http://test.com?var=%C2%AE"
$url = encodeURI("http://test.com?var=®")

次に、PHPurldecode側では、使用する前に次のようにエスケープを解除する必要があります。

$url = urldecode($_POST['url']);

それでも機能しない場合は、urlパラメータをファイルに記録するか、出力してブラウザコンソールで調べてください。

于 2012-08-01T13:21:10.793 に答える
-1

これは、サーバーがURLを受信する方法によって異なります。URLは、ASCII文字のサブセットのみで構成できます。「®」は間違いなくそのサブセット内になく、URLエンコードする必要があります。%xxURLエンコードは、生のバイトをペアでエンコードするだけです。「®」は、異なるバイトにエンコードするいくつかの異なるエンコーディングでエンコードできるため、そのURL表現は1つではありません。

したがって、http://example.com/®は有効なURLではなく、有効にする単一の方法はありません。そもそもこのURLを扱う必要はありません。

于 2012-08-01T13:47:25.417 に答える