2

我有一个用 JavaScript 和 PHP 编写的小工具,它获取 URL 列表并检查所有 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);
        ...

我尝试使用urldecode(),但这会将整个 URL 与http://to一起编码http%3A%2F%2F

知道为什么这个 ® 会导致问题吗?

4

3 回答 3

0

Javascript方面,您需要使用如下encodeURI函数转义 url:

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

然后,在PHP端,在使用它之前,您需要urldecode像这样取消转义它:

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

如果这仍然不起作用,请将 url 参数记录到文件中或将其输出并使用浏览器控制台进行检查。

于 2012-08-01T13:21:10.793 回答
0

使用parse_url( )和urlencode(),path和.queryfragment

然后重新组合编码的 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 回答
-1

这取决于服务器希望如何接收 URL。URL 可能只包含 ASCII 字符的子集。"®" 肯定不在该子集中,需要进行 URL 编码。URL 编码只是将原始字节%xx成对编码。由于“®”可以用几种不同的编码来编码,这些编码编码为不同的字节,因此没有一种URL 表示形式。

因此,http://example.com/®不是一个有效的 URL,并且没有单一的方法可以使它有效。您不必从一开始就处理此 URL。

于 2012-08-01T13:47:25.417 回答