Как передать URL в качестве параметра метода контроллера в codeigniter - PullRequest
9 голосов
/ 06 марта 2012

У меня есть контроллер Codeigniter, который принимает полный URL-адрес в качестве первого аргумента, но переданный URL-адрес только внутри моего контроллера показывает только http:

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

Как я могу решить эту проблему?

Ответы [ 5 ]

10 голосов
/ 27 мая 2013

, если вы хотите передать URL в качестве параметров, используйте

UrlEncode (base64_encode ($ ул))

есть:

$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/

8 голосов
/ 06 марта 2012

В контроллерах 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.На самом деле, я удивлен, что такой 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;
}
1 голос
/ 03 июля 2018

Вы можете попробовать это.Это сработало для меня.«кодировать» значение перед передачей

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

«декодировать» значение после получения

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

ссылка: https://forum.codeigniter.com/printthread.php?tid=40607

1 голос
/ 06 марта 2012

Помимо вопроса о том, следует ли вам передавать URL-адрес в URL-адресе, подумайте о том, как вы передаете его:

example.com/theparameter/

, но ваш URL-адрес будет выглядеть как

example.com/http://..../
* 1006.* Видите, где вы идете не так, как надо?Платформа CodeIgniter берет параметр из URL, разделенного косой чертой.Таким образом, ваша функция работает точно так же, как и должна.

Если это то, как вы должны это сделать, тогда URL передает код вашего параметра перед его передачей.

0 голосов
/ 12 июня 2015

Мне нравились @ user72740, пока я не обнаружил, что он все еще может генерировать символы, не разрешенные CI, такие как%.

В итоге я преобразовал строку сегмента в шестнадцатеричный код, а затем вернул их обратно.

Итак, я создал MY_URI, который расширил CI_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 (), потому что таким образом строка может быть произвольно длинной.Но теперь мне не нужно беспокоиться о знаках, отступах и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...