1

我正在尝试将 URL 作为 CI 中我的一个 URI 段的值。我的控制器方法被定义为接受这样的参数。但是,当我转到 URL 时,我收到 404 错误。例如:

www.domain.com/foo/urlencoded-url/

有什么想法有什么问题吗?我应该通过 GET 来代替吗?

更新:

// 生成 404 的 URL http://localhost/myapp/profile_manager/confirm_profile_parent_delete/ugpp_533333338/http%3A%2F%2Flocalhost%2Fmyapp%2Fdashboard%2F

// 这是在我的profile_manager控制器中 public function confirm_profile_parent_delete($encrypted_user_group_profile_parent_id = '', $url_current = '')

如果我删除第二个 URI 段,我不会得到 404:http://localhost/myapp/profile_manager/confirm_profile_parent_delete/ugpp_533333338/

4

6 回答 6

4

似乎 %2F 破坏了 apache。

可能的解决方案:

  1. preg_replace /'s 到 -'s (或其他东西),然后再发送 url 然后将其切换回另一端。
  2. 将 apache 设置为 AllowEncodedSlashes On
  3. 有点 hack,但您甚至可以将 url 保存到会话变量或其他东西,而不是通过 url *shrug * 发送
  4. 发送前双 url 编码
于 2012-05-16T05:11:15.167 回答
1

在段中传递 urlendode() 的 URL,然后使用自己的 (MY_*) 类对其进行解码:

应用程序/核心/MY_URI.php:

class MY_URI extends CI_URI {

    function _filter_uri($str)
    {
        return rawurldecode(parent::_filter_uri($str));
    }
}

// EOF
于 2015-02-16T14:42:05.847 回答
0

您可能需要更改 config/route.php 中的规则以接受 URL 中的编码字符。您还可以从以下文章中查看一些解决方案:

于 2012-05-16T06:05:20.717 回答
0

我实际上不得不做 urlencode(urlencode(urlencode(

和 urldecode(urldecode(urldecode(

3次!!它终于奏效了,两次没有削减它。

于 2012-12-30T01:46:30.627 回答
0

尝试

function __autoload($class){
 if(!empty($_SERVER['REQUEST_URI'])){
  $_SERVER['REQUEST_URI'] = $_SERVER['REDIRECT_QUERY_STRING'] = $_SERVER['QUERY_STRING'] = $_SERVER['REDIRECT_URL'] = $_SERVER['argv'][0]  = urldecode($_SERVER['REQUEST_URI']); 
}
}

在 config.php 这个方法对我有用

于 2014-02-06T17:35:06.137 回答
0

这已经很老了,但我想我会分享我的解决方案。

不要接受参数作为 url 路径,而是接受它作为 get 变量:

http://localhost/myapp/profile_manager/confirm_profile_parent_delete/ugpp_533333338?url_current=http%3A%2F%2Flocalhost%2Fmyapp%2Fdashboard%2F

在代码中:

function confirm_profile_parent_delete($encrypted_user_group_profile_parent_id = '') {
    $url_current = $this->input->get('url_current');
    ...

这似乎有效。

于 2014-06-18T05:17:32.113 回答