如何在CodeIgniter中进行URL的编码/解码

8
我会将一个链接发送到用户的电子邮件中,以便通过单击该链接来激活他的帐户。 示例链接: http://test.com/welcome/make_active_user/($user_id)
然后我在我的控制器中对$user_id进行编码,之后我的链接看起来像下面这样: http://test.com/welcome/make_active_user/17elQOjxrOXDsZdDZVFY7JFrB0TJFojdS+5OTpiIq/XXIaVrDfVWQ7xgOXXqGsURIFe/Udvm/XHrNWtbZXFA2g== 到此为止一切都很好。现在我想解码$user_id,但是"/"符号会导致问题。CodeIgniter只取"/"符号之前的字符。如何获取不带"/"的编码用户ID输出?
我在我的控制器中使用了"$this->encrypt->encode($user_id,$key);"。
请帮忙。

检查此链接,您将找到所需内容:http://stackoverflow.com/questions/6268873/codeignitor-urlencode-decode - Ahmed Ziani
无法工作,仅将URL中/符号之前的内容视为ID。 - Sumon
你应该使用某种编码方法,该方法不会生成任何 / # & 等其他字符,以及以 == 结尾的字符。我认为你使用了 base64,这是无效的。我使用了 bin2hex 和 hex2bin。 - Shaiful Islam
5个回答

6

在像这样的链接中发送之前,请将已编码的$user_id传递给php函数urlencode()

$user_id_link = urlencode($user_id);

使用url decode()解码从链接返回的字符串,如下所示:

$user_id = urldecode($user_id_link);

4

您需要修改加密类以编码URL安全字符串。

class MY_Encrypt extends CI_Encrypt
{

    function encode($string, $key="", $url_safe=true)
    {
        $ret = parent::encode($string, $key);

        if ($url_safe)
        {
            $ret = strtr(
                    $ret,
                    array(
                        '+' => '.',
                        '=' => '-',
                        '/' => '~'
                    )
                );
        }

        return $ret;
    }


    function decode($string, $key="")
    {
        $string = strtr(
                $string,
                array(
                    '.' => '+',
                    '-' => '=',
                    '~' => '/'
                )
            );

        return parent::decode($string, $key);
    }
}

然后您可以创建一个$url_safe链接。

从配置文件中获取加密密钥。

$key = $this->config->item('encryption_key');

通过将第三个参数设置为true,创建一个URL安全字符串。
$encoded_url_safe_string = urlencode($this->encrypt->encode('secret', $key, true));

您需要使用rawurldecode来解码字符串。
$decoded_url_safe_string = rawurldecode($encoded_url_safe_string, $key);

你的解决方案不是做了两次同样的事情吗?你修改的 MY_Encrypt 类正在进行字符的加 / 解密,而 PHP 函数 urlencode()urldecode() 又再次进行了编码 / 解码。 - MDeuerlein

3
我曾经遇到过相同的问题,CodeIgniter的encrypt->encode()方法会产生URL不允许的字符,但我采用以下方法解决了这个问题:
  1. 首先对$user_id进行encode()编码
  2. 然后将加密字符串中的不允许字符替换为允许字符
  3. 在解码之前将这些字符替换回原始字符
  4. 最后对$user_id进行decode()解码
下面是代码:
$this->encrypt->encode($user_id,$key);
$user_id = strtr($user_id,array('+' => '.', '=' => '-', '/' => '~'));
//your email body (link the user id here)

现在是解码的时间。
$user_id = strtr($user_id,array('.' => '+', '-' => '=', '~' => '/'));
$this->encrypt->decode($user_id,$key);

0

我想你的问题不在于'/',而可能是'='符号。

为了编码和解码CodeIgniter中的URL,您可以使用任何一个原生的php函数:http://php.net/manual/en/ref.url.php

但是,为了避免在CodeIgniter中解码编码的URL时出现问题,您可以将每种情况中所需使用的特殊字符(例如您的情况下的'=')添加到文件application/config/config.php中的$config['permitted_uri_chars']中。


0
尝试这个: $query = urldecode($query); $query = urlencode($query);

请清理重复的代码并添加一个简短的解释说明您的代码是如何工作的。简洁明了的回答是最好的回答。 - Simas Joneliunas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接