最近使用 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 進行編碼并嘗試解決問題。如果問題依舊存在,可以手動處理一些字符,或者聯系對方維護網站的人員進行處理。