PHP中的正斜杠编码

URL Encoding forward slashes in PHP

本文关键字:编码 PHP      更新时间:2023-09-26

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

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

我对此进行编码,然后我尝试将其发送到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请求的另一个

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之前被web服务器解码为正常的路径分隔符。例如,Apache有一个特定的设置来允许这些:AllowEncodedSlashes On.

你可以使用这个来阻止Apache解析编码的斜杠。

<VirtualHost 127.0.0.1:80>
  ServerName site.example.com
  AllowEncodedSlashes On
  # ...
</VirtualHost>

PHP Documentation对于这里发生的事情有一个非常好的解决方案:

<?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

处理特殊字符。

**如果这不是你想要的,可能值得在这里发布你的代码或澄清发生了什么。