HTTP状态代码,URL中包含特殊字符

时间:2012-08-01 12:55:32

标签: php javascript http-headers

我有一个用JavaScript和PHP编写的小工具,它接受一个URL列表并检查所有这些URL的HTTP状态代码。 我用curl来检查实际状态 只要我有很好的URL,它就能很好用。我在使用®的网址时遇到问题。当我知道它应该返回404时,我的工具会返回301

我的猜测是,这个'®'正在转换为类似%C2的内容并导致问题。

我知道可以这样做,因为粘贴相同的网址here会返回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(),但这会将整个网址与http://一起编码为http%3A%2F%2F

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

3 个答案:

答案 0 :(得分:0)

仅使用urlencode()path queryfragment$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])

然后重新组合编码的URL并发出请求。

{{1}}

答案 1 :(得分:0)

Javascript 一侧,您需要使用encodeURI函数转义网址,如下所示:

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

然后,在 PHP 方面,您需要在使用它之前用urldecode取消它:

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

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

答案 2 :(得分:-1)

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

因此,http://example.com/®不是有效的网址,并且没有一种方法可以使其有效。您不必开始处理此URL。