我在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解释为正斜杠?
答案 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>