PHP中的URL编码正斜杠

Joã*_*rra 2 javascript php curl laravel

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

http://mywebpage.dev/manufacturer/BETA/year/2016/category/M/model/MINI%20CROSS%2010%2F10/versions
Run Code Online (Sandbox Code Playgroud)

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

我真的没有选择了,这里的问题到底是什么?URI 编码不应该解决这些问题吗?为什么 PHP 仍然将 %2F 视为正斜杠?有什么办法可以使这项工作?

编辑

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

var model    = $(".model-list li.active").text();
model = encodeURI(model);
Run Code Online (Sandbox Code Playgroud)

然后我有一个 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');
}
Run Code Online (Sandbox Code Playgroud)

这又链接到另一个向外部 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;

}
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*han 5

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

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

<VirtualHost 127.0.0.1:80>
  ServerName site.example.com
  AllowEncodedSlashes On
  # ...
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)