【问题标题】:HTTP status code with special characters in the URLURL 中带有特殊字符的 HTTP 状态代码
【发布时间】:2012-07-30 09:05:58
【问题描述】:

我有一个用 JavaScript 和 PHP 编写的小工具,它获取 URL 列表并检查所有 URL 的 HTTP 状态代码。 我使用 curl 来检查实际状态。
只要我有不错的 URL,它就可以很好地工作。我遇到了包含 ® 的 URL 的问题。当我知道它应该返回 301 时,我的工具返回 404

我的猜测是这个 '®' 正在被转换为 %C2 之类的东西并导致问题。

我知道可以这样做,因为粘贴相同的 URL here 会返回 301

我的 PHP curl 看起来像这样:

        ...
        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

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

【问题讨论】:

    标签: php javascript http-headers


    【解决方案1】:

    仅使用parse_url()urlencode() pathqueryfragment

    然后重新组合编码后的 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])
    

    【讨论】:

      【解决方案2】:

      Javascript 方面,您需要使用 encodeURI 函数转义 url,如下所示:

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

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

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

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

      【讨论】:

      • 我按照你的建议做了,Firebug 正确显示了 URL,但我仍然得到 404 而不是 301
      【解决方案3】:

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

      因此,http://example.com/® 不是有效的 URL,也没有单一的方法可以使其有效。您不必一开始就处理此 URL。

      【讨论】:

      • 我知道这不是一个有效的 URL,但这是有人创建它们的方式,我需要经常检查数百个这样的 URL。
      • 然后你可以尝试类似@Internet 的解决方案。我的意思是 URL 已经很糟糕了,如果可能的话,你应该先解决这个问题。
      猜你喜欢
      • 1970-01-01
      • 2016-08-23
      • 2015-02-25
      • 2012-02-15
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      相关资源
      最近更新 更多