【问题标题】:url encoded forward slashes breaking my codeigniter appurl 编码的正斜杠破坏了我的 codeigniter 应用程序
【发布时间】:2010-09-23 15:09:53
【问题描述】:

我正在尝试创建一个像这样工作的 url 字符串:

/app/process/example.com/index.html

换句话说,

/app/process/$URL

然后我用

检索 url
$this->uri->segment(3);

URL 中的正斜杠当然会成为访问 uri 段的问题,所以我将继续对 URL 部分进行 url 编码:

/app/process/example.com%2Findex.html

.. 但现在我只得到一个 404 说...

Not Found

The requested URL /app/process/example.com/index.html was not found on this server. 

看来我的正斜杠 url 编码破坏了 CI 的 URI 解析器。

我能做些什么来解决这个问题?

【问题讨论】:

    标签: php url codeigniter uri urlencode


    【解决方案1】:

    我认为您收到的错误消息不是来自 codeigniter,而是来自您的网络服务器。

    我使用 Apache2 复制了这个,甚至没有使用 CodeIgniter:我创建了一个文件 index.php,然后访问了 index.php/a/b/c - 它运行良好。如果我随后尝试访问 index.php/a/b/c%2F,我会从 Apache 得到 404。

    我通过添加到我的 Apache 配置来解决它:

    AllowEncodedSlashes On

    更多信息请参见the documentation

    完成此操作后,您可能需要在 codeigniter 中使用 $config['permitted_uri_chars'] 如果它仍然无法正常工作 - 您可能会发现斜杠被过滤掉了

    【讨论】:

    • 这是正确的。然而,即使修复后您也可能会遇到问题,因为定义 PATH_INFO 的 CGI 标准要求字符串经过一轮 URL 解码,这可能会破坏斜线。仅在 Apache 上,您可以使用 REQUEST_URI 代替它不会受到此影响...不知道 CI 是否可以使用它。
    • 我刚刚在一个网站上解决了这个问题。这有点小技巧,但它完成了工作:我对 URL 进行了双重 urlencoded。这样,REQUEST_URI 的 urldecode 就不会过早恢复 /。
    • 其实你想要的大概是AllowEncodedSlashes NoDecode
    • 忘了说至少需要 apache 2.3。如果您被困在下面,请尝试使用/ 作为斜线,然后根据需要来回替换它们。它们会像在 html 中一样显示。
    【解决方案2】:

    解决这个问题的一种方法是用不会破坏 CodeIgniter URI 解析器的东西来替换你在 URI 段中传递的 URL 变量中的任何正斜杠。例如:

    
    $uri = 'example.com/index.html';
    $pattern = '"/"';
    $new_uri = preg_replace($pattern, '_', $uri);
    

    这会将所有正斜杠替换为下划线。我敢肯定它类似于您对正斜杠进行编码的操作。然后在其他页面上检索值时,只需使用以下内容:

    
    $pattern = '/_/';
    $old_uri = preg_replace($pattern, '/', $new_uri);
    

    这会将所有下划线替换为正斜杠,以恢复您的旧 URI。当然,您需要确保您使用的任何字符(在这种情况下为下划线)不会出现在您将传递的任何可能的 URI 中(因此您可能根本不想使用下划线)。

    【讨论】:

      【解决方案3】:

      使用CodeIgniter,URL的路径对应一个控制器,控制器中的一个函数,函数的参数。

      您的 URL /app/process/example.com/index.html 将对应于 app.php 控制器、内部的 process 函数以及两个参数 example.com 和 index.html:

      <?php
      class App extends Controller {
          function process($a, $b) {
             // at this point $a is "example.com" and $b is "index.html"
          }
      }
      ?>
      

      编辑:在重新阅读您的问题时,您似乎想将部分 URL 解释为另一个 URL。为此,您需要编写函数以获取可变数量的参数。为此,您可以使用函数 func_num_args 和 func_get_arg,如下所示:

      <?php
      class App extends Controller {
          function process() {
              $url = "";
              for ($i = 0; $i < func_num_args(); $i++) {
                  $url .= func_get_arg($i) . "/";
              }
      
              // $url is now the url in the address
          }
      }
      ?>
      

      【讨论】:

        【解决方案4】:

        在配置文件中更改您的 allowed_uri_chars 索引

        $config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
        

        【讨论】:

          猜你喜欢
          • 2011-03-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-13
          • 2016-10-29
          • 2018-05-30
          • 2016-05-16
          • 2010-10-10
          相关资源
          最近更新 更多