2012-08-01 79 views
2

我有一个用JavaScript和PHP编写的小工具,它包含一个URL列表并检查所有这些URL的HTTP状态代码。 我使用curl来检查实际状态。
只要我有漂亮的网址,它就可以很好地工作。我遇到问题,其中有®。当我知道它应该返回301时,我的工具返回404在URL中包含特殊字符的HTTP状态代码

我的猜测是这个'®'被转换成类似%C2的东西,并导致一个问题。

我知道这可以做到,因为粘贴这个相同的URL 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()但这编码整个URL与http://http%3A%2F%2F一起。

任何想法为什么这是导致问题?

回答

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]) 
0

的Javascript侧,则需要使用encodeURI功能这样逃脱的网址:

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

然后,在PHP一面,你需要urldecode反转义之像这样在你使用它之前:

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

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

+0

我照你的建议做了,Firebug显示的URL正确,但我仍然得到404而不是301 – 6bytes 2012-08-01 13:37:01

-1

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

因此,http://example.com/®不是一个有效的URL,并没有一种方法使其有效。你不应该首先处理这个URL。

+0

我知道这不是一个有效的URL,但这是人们创建它们的方式,我需要检查几百经常这样的网址。 – 6bytes 2012-08-01 13:49:53

+0

然后你可以尝试一下@Internet的解决方案。如果可能的话,我说网址已经被绑定了,你应该先解决这个问题。 – deceze 2012-08-01 13:51:33