最近使用 PHP 的 curl 函数遇到了一个问题:Illegal character found in URL 。这个错误让我对我的代码产生了疑问,一开始我以为是我自己犯了错误,但是后来我发现这个问题与我没有任何关系,因为这个问题出在了我要访问的网站的 URL 上。
这个问题出现的原因是 URL 中有非法字符,而 curl 函数对于这些非法字符是不允许的。下面是一些常见的非法字符:
$illegalChars = array("<", ">", "#", "%", "{", "}", "|", "\\", "^", "~", "[", "]", "`", ";", "/", "?", ":", "@", "=", "&");
如果你要使用这些非法字符来作为参数或者值,那么就要对这些字符进行 URL 编码了。URL 编码是将非法字符转化为 % 加上其 ASCII 码值的十六进制数的形式,比如空格转化为 %20。PHP 中有一个函数 urlencode 可以方便地实现 URL 编码:
$url = "http://example.com/api/search?keyword=".urlencode("something to search");curl_setopt($ch, CURLOPT_URL, $url);
不幸的是,有些时候即使你已经使用了 urlencode 函数对 URL 进行了编码,仍然会出现以上的错误。因为有些网站可能没有按照 URL 编码的规范来实现,或者校验方式不是标准的 RFC 3986。
比如以下这个例子:
$url = "http://example.com/api/search?keyword=" . rawurlencode("something to search?keyword=apple");curl_setopt($ch, CURLOPT_URL, $url);
在这种情况下,即使使用了 rawurlencode 函数进行编码,仍然会收到 illegal character 的错误。这是因为在 URL 中?后面的字符应该被编码为 %3F,而不是直接保留为 ?。
解决这个问题的办法也很简单,我们可以手动将 ? 转化为 %3F,如下所示:
$url = "http://example.com/api/search?keyword=" . str_replace("?", "%3F", rawurlencode("something to search?keyword=apple"));curl_setopt($ch, CURLOPT_URL, $url);
在实际操作中,我们可以通过输入 URL 到浏览器地址栏里这一步来验证 URL 是否合法,如果浏览器能够成功打开,那么这个 URL 就是合法的。
总之,遇到 PHP curl 报错 Illegal character found in URL 时,我们需要检查 URL 是否合法、是否按规范编码。如果没有按规范,请使用 urlencode 函数对 URL 进行编码并尝试解决问题。如果问题依旧存在,可以手动处理一些字符,或者联系对方维护网站的人员进行处理。