Javascript PHP中URL编码前斜杠
我在PHP中有一个页面,我试图连接到一个API并获取有关摩托车的信息,这里的问题是我使用一个内部路由通过CURL调用API,该路由可访问如下Javascript PHP中URL编码前斜杠,javascript,php,laravel,curl,Javascript,Php,Laravel,Curl,我在PHP中有一个页面,我试图连接到一个API并获取有关摩托车的信息,这里的问题是我使用一个内部路由通过CURL调用API,该路由可访问如下 http://mywebpage.dev/manufacturer/BETA/year/2016/category/M/model/MINI%20CROSS%2010%2F10/versions 我对其进行编码,然后尝试将其发送到API,在API中对其进行解码,并将JSON响应发送回,但问题是,出于某种原因,每当我有任何正向斜杠时,无论我是否对其进行编码
http://mywebpage.dev/manufacturer/BETA/year/2016/category/M/model/MINI%20CROSS%2010%2F10/versions
我对其进行编码,然后尝试将其发送到API,在API中对其进行解码,并将JSON响应发送回,但问题是,出于某种原因,每当我有任何正向斜杠时,无论我是否对其进行编码,它都无法到达路由的方法
我真的没有选择了,到底是什么问题?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请求的API
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解释为正斜杠 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));
}
?>
编码的斜杠在传递给PHP之前,可能会被Web服务器解码为普通路径分隔符。例如,Apache有一个特定的设置来允许这些操作:AllowEncodeDSLASH On
您可以使用它来防止Apache解析编码的斜杠
<VirtualHost 127.0.0.1:80>
ServerName site.example.com
AllowEncodedSlashes On
# ...
</VirtualHost>
ServerName site.example.com
AllowEncodesOn
# ...
您提供的链接已经是URL编码的,如果您再次编码,它将变得凌乱。不,不,该链接是初始javascript编码和后端方法调用的结果,该链接是一个发出CURL请求的内部路由,问题是,尽管编码该方法无法触发,但这里有一些进展,现在它给我一个错误,没有找到请求的URL/manufacturer/OPEL/year/1990/category/L/model/CORSA A 3/5 P/版本在该服务器上找不到。此外,尝试使用ErrorDocument处理请求时遇到404 Not Found错误。很好:)看起来它正在跳过重写规则。如何将请求路由到PHP?您是否使用.htaccess文件?