我有一个用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
。
知道为什么这会导致问题?
答案 0 :(得分:0)
仅使用urlencode()
和path
query
,fragment
和$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。