【问题标题】:Get the new url after Post by CURL获取 Post by CURL 后的新 url
【发布时间】:2012-04-14 13:43:09
【问题描述】:

这是一个例子:

来源网址是http://www.vietbando.com/maps/#t=1&sk=258+lý+Thường+Kiệt

当我发布表单时。

它变成这样的新网址

http://www.vietbando.com/maps/#t=1&sk=258+lý+Thường+Kiệt&l=4&kv=15.0132985,106.744091

如何获取新的网址?

【问题讨论】:

    标签: php redirect curl


    【解决方案1】:

    如果您指的是重定向,则新 URL 应始终位于响应的 Location 标头中。

    要获取 curl 请求中包含的标头,请通过 curl_set_opt 设置 CURLOPT_HEADER 选项。

    如果您对导航到/获取下一个 URL 而不是获取实际 URL 更感兴趣,则可以使用 FOLLOW_REDIRECTS 设置。

    最后,如果您正在执行任何类型的 HTTP 工作而不是几次调用,我强烈建议您使用 HTTP 库(因为 PHP cURL 是一种折磨)。请参阅GuzzleHttpfulRequests

    【讨论】:

    • 我尝试了 CURLOPT_HEADER 和 FOLLOW_REDIRECTS,但它不起作用。你可以试试这个链接 vietbando.com/maps/#t=1&sk=258+lý+Thường+Kiệt> 它会变成 vietbando.com/maps/…>
    【解决方案2】:

    在这种情况下,您可以解析响应的标题以获取 url。 您必须使用此代码来执行此操作:

    $ch_url = curl_init();
    curl_setopt($ch_url, CURLOPT_URL, 'http://www.example.com/)'; //your first url
    curl_setopt($ch_url, CURLOPT_USERAGENT, 'AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.39 Safari/530.5');
    curl_setopt($ch_url, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch_url, CURLOPT_HEADER, 1);
    curl_setopt($ch_url, CURLOPT_NOBODY, 1); //we don't need to recieve the body of response
    $headers = curl_exec($ch_url);
    curl_close ($ch_url);
    
    $pattern = '`.*?((http)://[\w#$&+,\/:;=?@.-]+)[^\w#$&+,\/:;=?@.-]*?`i'; //this regexp finds your url
    if (preg_match_all($pattern,$headers,$matches))
        $url = $matches[1][0]; //your second url
    

    【讨论】:

    • 我不太明白。这是我做的代码,但我做了,但它不返回新的 url $ch_url = curl_init(); curl_setopt($ch_url, CURLOPT_URL, 'vietbando.com/maps/#t=1&sk=258+lý+Thường+Kiệt'); //你的第一个网址 curl_setopt($ch_url, CURLOPT_USERAGENT, 'AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.39 Safari/530.5'); curl_setopt($ch_url, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch_url, CURLOPT_HEADER, 1); curl_setopt($ch_url, CURLOPT_NOBODY, 1); //我们不需要接收响应的主体 $headers = curl_exec($ch_url); curl_close ($ch_url);
    • $pattern = '.*?((http)://[\w#$&+,\/:;=?@.-]+)[^\w#$&+,\/:;=?@.-]*?i'; //这个正则表达式找到你的网址 if (preg_match_all($pattern,$headers,$matches)){ $url = $matches[1][0]; //你的第二个网址 echo $url; }
    • 因此,如果您通过 cURL 向一个页面发出请求并将您重定向到另一个页面(302 或 301 重定向),则此代码将起作用。您的链接 (vietbando.com/maps/#t=1&sk=258+lý+Thường+Kiệt) 不会重定向到任何页面。这就是为什么您无法获得新链接,它只是不存在。请更清楚地解释第二个链接是如何出现的。我不明白这一点:“当我发布表单时。”
    • 对不起我的话。这个站点 vietbando.com/maps 有一个输入标签,但它没有 name 属性,所以我像 vietbando.com/maps/#t=1&sk=268+Ly+Thuong+Kiet 这样从 url 传递值。当您运行 url 时,它将更改为 vietbando.com/maps/… 。我可以自己做,但我有很大的网址要做。我认为 CURL 可能会这样做,但我还没有找到解决方案。
    • 此链接 (vietbando.com/maps/#t=1&sk=268+Ly+Thuong+Kiet) 不会将我重定向到新链接。所以这里没有重定向。尝试更改您的代码,然后我的代码将起作用。我尝试在 Mac 上的 Chrome、Opera 和 Firefox 中进行重定向,但不能。
    猜你喜欢
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    相关资源
    最近更新 更多