【问题标题】:php curl with CURLOPT_FOLLOWLOCATION error带有 CURLOPT_FOLLOWLOCATION 错误的 php curl
【发布时间】:2011-04-22 21:10:26
【问题描述】:

我遇到了一个错误

启用安全模式或设置 open_basedir 时,无法激活 CURLOPT_FOLLOWLOCATION

我在谷歌上搜索了很多解决方案,但在这个网站上它们不起作用。只需要 CURLOPT_FOLLOWLOCATION。愚蠢的宿主不想启用 safe_mode 或 open_basedir 。我可以自己启用它们吗,可以用一些参数创建 htaccess 吗?

【问题讨论】:

    标签: php curl


    【解决方案1】:

    该错误表示已启用 safe_mode 或 open_basedir(可能是 open_basedir),如果您的主机有任何合适的安全设置,您可能无法覆盖它们。

    所以你有选择

    1) 更改主机(我想不是很理想)

    2) 使用类似于 php curl_setopt 页面上的函数,即http://www.php.net/manual/en/function.curl-setopt.php#95027

    以下是第2点指定函数的固定版本

    function curl_redirect_exec($ch, &$redirects, $curlopt_header = false) {
        curl_setopt($ch, CURLOPT_HEADER, true);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
        $data = curl_exec($ch);
    
        $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if ($http_code == 301 || $http_code == 302) {
            list($header) = explode("\r\n\r\n", $data, 2);
    
            $matches = array();
            preg_match("/(Location:|URI:)[^(\n)]*/", $header, $matches);
            $url = trim(str_replace($matches[1], "", $matches[0]));
    
            $url_parsed = parse_url($url);
            if (isset($url_parsed)) {
                curl_setopt($ch, CURLOPT_URL, $url);
                $redirects++;
                return curl_redirect_exec($ch, $redirects, $curlopt_header);
            }
        }
    
        if ($curlopt_header) {
            return $data;
        } else {
            list(, $body) = explode("\r\n\r\n", $data, 2);
            return $body;
        }
    }
    

    【讨论】:

    • 很有趣,但脚本在我的主机上运行良好(廉价和虚拟),但老板使用愚蠢的主机并且不想改变。关于这个功能 - 我知道,当我开始编写脚本时,我手动调用每个 url,但最后一个 url 不会工作,只有使用 CURLOPT_FOLLOWLOCATION 可以帮助我
    • 抱歉,我并没有真正测试这个功能,你说得对,它不起作用(它假设 Location 标题不是最后一个)我添加了一个我测试过的更正版本我的回答。
    • 您的解决方案存在一些错误。正则表达式应该是[^\n]。当递归调用curl_redirect_exec 时,你应该传递$curlopt_header
    • 愚蠢的问题:我究竟如何使用它?当我尝试时,它说Fatal error: Cannot pass parameter 2 by reference 。我用$xml = curl_redirect_exec($ch, true);
    【解决方案2】:

    如果您指定在使用CURLOPT_REDIR_PROTOCOLS 进行重定向期间只允许使用 http 和 https 协议,则您可以在不使用safe_modeopen_basedir 的情况下使用CURLOPT_FOLLOWLOCATION

    【讨论】:

    • CURLOPT_REDIR_PROTOCOLS 设置为CURLPROTO_HTTP | CURLPROTO_HTTPS 似乎对open_basedir 没有帮助。
    【解决方案3】:

    您好,我修复了添加此条件:

    $safeMode = @ini_get('safe_mode');
    $openBasedir = @ini_get('open_basedir');
    if (empty($safeMode) && empty($openBasedir)) {
        curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION, true);
    }else
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    

    并添加到我的 .htaccess 文件中

    php_flag safe_mode off
    php_flag open_basedir off
    

    【讨论】:

    • 你的 $curl 和 $curl_handle 变量来自哪里?
    【解决方案4】:

    您可以使用以下链接中提供的代码作为替代方案。

    http://slopjong.de/2012/03/31/curl-follow-locations-with-safe_mode-enabled-or-open_basedir-set/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      • 2012-01-23
      相关资源
      最近更新 更多