我有一个Codeigniter控制器,它将完整的URL作为第一个参数,但我控制器中传递的URL仅显示http:
public function mydata($link)
{
echo $link; //then it show only http: rather than the full url http://abc.com
}
我该如何解决这个问题?
答案 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));
...
...
...
你有一个编码器/解码器:
答案 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)));
答案 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()实现,因为这样字符串可以任意长。但现在我不必担心=标志和填充等。