URL编码PHP

时间:2016-06-27 15:38:55

标签: javascript php laravel curl

我在PHP中有一个页面,我试图连接到API并获取有关摩托车的信息,这里的问题是我使用内部路由通过CURL调用API,并且此路由可通过以下方式访问

http://mywebpage.dev/manufacturer/BETA/year/2016/category/M/model/MINI%20CROSS%2010%2F10/versions

我对此进行了编码,然后我尝试将其发送到API,在那里它被解码并且JSON响应被发回,但问题是由于某种原因它甚至没有到达路线' s方法每当我有任何正斜杠,无论我编码或不编码...

我这里的选项真的用完了,这究竟是什么问题?不应该编码URI编码修复这些问题吗?为什么PHP仍然将%2F视为正斜杠?有没有办法让这项工作?

修改

在我的javascript中,我通过jQuery获取模型的文本并将其编码如下

var model    = $(".model-list li.active").text();
model = encodeURI(model);

然后我有一个laravel路由,从Javascript调用中获取编码字符串并将其返回给PHP函数

public function versionsByYear($manufacturer, $year, $category, $model)
{
    $manufacturer = str_replace(" ", "%20", $manufacturer);
    $model        = str_replace(" ", "%20", $model);

    return $this->connect('manufacturer/'.$manufacturer.'/year/'.$year.'/category/'.$category.'/model/'.$model.'/versions');
}

反过来链接到另一个向外部API发出CURL请求的

public function connect($method)
{

    $url    = $this->apiUrl . '/' . $method;

    $ch     = curl_init();

    curl_setopt_array($ch, array(
        CURLOPT_URL             => $url,
        CURLOPT_HTTPHEADER      => array('Token: ' . $this->token),
        CURLOPT_RETURNTRANSFER  => true
    ));

    $out = curl_exec($ch);

    curl_close($ch);

    return $out;

}

API本身不是问题,因为当我传递与我的应用程序失败的完全相同的编码模型名称时,它的工作原理。应用程序只返回一个空字符串,无法完全找到路径中定义的方法,可能是因为将编码的%20解释为正斜杠?

2 个答案:

答案 0 :(得分:2)

PHP文档对于我认为正在发生的事情有一个非常好的解决方案:

<?php
function myUrlEncode($string) {
    $entities = array('%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%3F', '%25', '%23', '%5B', '%5D');
    $replacements = array('!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "?", "%", "#", "[", "]");
    return str_replace($entities, $replacements, urlencode($string));
}
?>

http://php.net/manual/en/function.urlencode.php

它处理特殊字符。

**如果这不是您想要的,可能值得在此处发布您的代码或澄清正在发生的事情。

答案 1 :(得分:2)

编码的斜杠可能在传递给PHP之前被网络服务器解码为普通的路径分隔符。例如,Apache有一个特定的设置允许这些:AllowEncodedSlashes On。

您可以使用它来防止Apache解析编码的斜杠。

<VirtualHost 127.0.0.1:80>
  ServerName site.example.com
  AllowEncodedSlashes On
  # ...
</VirtualHost>
相关问题