如何在codeigniter中将URL作为控制器方法的参数传递

时间:2012-03-06 13:54:10

标签: php codeigniter url

我有一个Codeigniter控制器,它将完整的URL作为第一个参数,但我控制器中传递的URL仅显示http:

public function mydata($link)
{
   echo $link; //then it show only http: rather than the full url http://abc.com
}

我该如何解决这个问题?

5 个答案:

答案 0 :(得分:10)

如果您想将url作为参数传递,请使用

进行urlencode(BASE64_ENCODE($ STR))

即:

$url=urlencode(base64_encode('http://stackoverflow.com/questions/9585034'));
echo $url

结果:

aHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy85NTg1MDM0

然后你打电话:

http://example.com/mydata/aHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy85NTg1MDM0

并在您的控制器中

public function mydata($link)
{

$link=base64_decode(urldecode($link));
...
...
...

你有一个编码器/解码器:

http://www.base64decode.org/

答案 1 :(得分:8)

在Codeigniter控制器中,每个方法参数都来自以/斜杠分隔的URL。 http://example.com

有几种不同的方法可以将参数拼凑成一个字符串:

public function mydata($link)
{
    // URL: http://example.com/mysite/mydata/many/unknown/arguments

    // Ways to get the string "many/unknown/arguments"
    echo implode('/', func_get_args());
    echo ltrim($this->uri->uri_string(), '/');
}

然而:

在您的情况下,使用其中任何一种方法都可能会丢失双斜杠//,因为它会在URL中压缩为一个。事实上,我很惊讶这样的网址:

  

http://example.com/mydata/http://abc.com

...没有触发Codeigniter的“URI包含不允许的聊天”错误。我建议您使用查询字符串来完成此任务,以避免所有这些问题:

  

http://example.com/mydata/?url=http://abc.com

public function mydata()
{
    $link = $this->input->get('url');
    echo $link;
}

答案 2 :(得分:1)

除了您是否应该在URL中传递URL时,请考虑如何传递它:

example.com/theparameter/

但您的网址实际上似乎是

example.com/http://..../

看看你哪里出错了? CodeIgniter框架从URL中取出参数,用斜杠分隔。所以你的功能完全正常。

如果你必须这样做,那么在传递参数之前对你的参数进行URL编码。

答案 3 :(得分:1)

您可以尝试一下。它对我有用。 在传递之前对值进行“编码”

$value = str_replace('=', '-', str_replace('/', '_', base64_encode($album)));

“解码”接收后的值

$value = base64_decode(str_replace('-', '=', str_replace('_', '/', $value)));

参考:https://forum.codeigniter.com/printthread.php?tid=40607

答案 4 :(得分:0)

我确实喜欢@ user72740,直到我发现它仍然可以生成CI不允许的字符,如%。

我最终做的是将段字符串转换为十六进制,然后返回。

所以我创建了一个扩展CI_URI的MY_URI并添加了这些方法:

/**
* Segmentize
*
* Makes URI segments,  CI "segment proof"
* Removes dots and forwardslash leaving ONLY hex characters
* Allows to pass "anything" as a CI URI segment and coresponding function param
*
* @access   public
* @return   string
*/
public function segmentize($segment){
    if(empty($segment)){
        return '';
    }
    return bin2hex($segment);
}

/**
* Desegmentize
*
* @access   public
* @return   string
*/
public function desegmentize($segment){
    if(empty($segment)){
        return '';
    }
    return $this->hex2bin($segment);
}

/**
* hex2bin
*
* PHP 5.3 version of 5.4 native hex2bin
*
* @access   public
* @return   string
*/
public function hex2bin($hex) {
    $n = strlen($hex);
    $bin = '';
    $i = 0;

    while($i < $n){
        $a = substr($hex, $i, 2);
        $c = pack('H*', $a);
        if ($i == 0){
            $bin = $c;
        }
        else {
            $bin .= $c;
        }
        $i += 2;
    }

    return $bin;
}

然后使用$this->uri->segmentize($url)创建段字符串和 $this->uri->desegmentize($this->input->post('url', true))将其恢复为可读格式。

因此

https://www.example.com/somewhere/over/the/rainbow

成为

68747470733a2f2f7777772e6d79736974652e636f6d2f736f6d6577686572652f6f7665722f7468652f7261696e626f77

然后回来。

我确信有更好的方法,比如base_convert()实现,因为这样字符串可以任意长。但现在我不必担心=标志和填充等。