【问题标题】:CodeIgniter Mod Rewrite Rules and the ControllerCodeIgniter Mod 重写规则和控制器
【发布时间】:2014-04-12 01:03:48
【问题描述】:

学习 PHP,我正在玩 mod_rewrite 和 CodeIgniter。我已经正确配置了我的 .htaccess 文件

RewriteEngine On
RewriteRule ^(resources)/(.*) $1/$2 [L]
RewriteRule ^(user_guide)/(.*) $1/$2 [L]
RewriteRule (.*) index.php?$1 [L]

我了解一点正则表达式,并且可以理解这里发生的事情。应用重写规则,然后服务器处理最终 URL,在上述情况下,将 index.php(前端控制器)附加到“漂亮”URL。到目前为止,一切都很好。

我现在想要一个 URL 模式:

/<person-name>/at/<place>

翻译成:

/index.php/person/list?personName=$1&place=$2

我在人员控制器的列表函数中处理请求。我不明白为什么以下不起作用:

RewriteRule ^([a-z]+)/(at)/([a-z]+)$ index.php/person/list?personName=$1&place=$2 [L]

我做错了什么/我的理解有什么缺陷?我看到占位符被正确提取($1 和 $3),但是,它抛出了 CodeIgniter 404。

非常感谢!

【问题讨论】:

  • 你不能在routes.php - $route['([az]+)/at/([az]+)'] = "person/list/$1/$2";
  • 是的,当我了解 routes.php 时,我最终做到了。 :-) 我正在寻找为什么我不能在 .htaccess 文件中这样做的答案。 :-) 顺便说一句,为什么我们不能通过 GET 参数访问那些 $1 和 $2 ?这行得通吗?
  • 在您的config.php 中是否都设置为true? - $config['allow_get_array'] = TRUE; $config['enable_query_strings'] = TRUE;
  • enable_query_strings 不是,但我只是将其设为 TRUE 并检查。同样的故事。

标签: php regex .htaccess codeigniter mod-rewrite


【解决方案1】:

最简单的解决方法可能会解决您的问题。通过将“at”括在括号中,您正在创建另一个匹配组,这意味着 $2 将始终是“at”。那可能会破坏一切。你想要index.php?person/list?personName=$1&amp;place=$3 但是你可能已经注意到了这个问题并在没有解决问题的情况下修复了它,在这种情况下,请继续阅读。

查看How to make CodeIgniter accept "query string" URLs?。这似乎表明您不能混合和匹配基于段的方法和查询字符串方法。如果没有看到您的控制器代码,我不能肯定地说,但我会在那里开始调查。你也可以试试:

RewriteRule ^([a-z]+)/(at)/([a-z]+)$ index.php?person/list/$1/$3 [L]

下面的通用 CI 重定向规则会做同样的事情;将 URL 作为查询字符串发送到 index.php 以进行处理。您已经说过您可以使用路由,因此您可以期望 person 和 place 作为两个参数,而不是将查询字符串传递给您的控制器。 CI 对查询字符串的处理还有很多不足之处,而且我从未尝试过 MOD_REWRITE 将包括查询字符串在内的内容转换为查询字符串。

【讨论】:

    猜你喜欢
    • 2013-09-17
    • 2010-11-13
    • 2012-05-13
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多