我尝试在我的Code Igniter应用程序的URL中编码日志的ID,并在我的控制器中检索它。我的最终目标是访问页面http://mysite.com/journal/3
并访问包含ID 3日志详细信息的页面。
在我的journal.php控制器文件中,我有
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Journal extends Controller {
public function index($journalId) {
$data['journalId'] = $journalId;
$this->view->load('journalPage', $data);
}
}
?>
在我的journalPage.php视图文件中,我有
This event has ID <?= $journalId ?>.
我在routes.php文件中写了这条规则。
$route['journal/(:num)'] = 'journal/$1';
这是我的html公用文件夹中的.htaccess文件。
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?$1 [QSA,L]
</IfModule>
然而,当我去mysite.com/journal/3时,我收到404错误。为什么呢?
答案 0 :(得分:3)
$route['journal/(:num)'] = 'journal/index/$1';
(:num) will become invalid if you encode
编辑: 如果您使用CI的加密类来编码您的ID(无意义) 你需要修改它以确保字符串是安全的。
答案 1 :(得分:1)
根据我在上面看到的情况,这只是错误的CI路由。
你.htaccess没问题(你只是从url中删除index.php)。
在其他两个步骤中(您的控制器和路径配置中存在问题)。
首先在控制器中,在创建新控制器时,您应该扩展CI_Controller 为了简化故事,这就是你的journal.php文件的样子:
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Journal extends CI_Controller {
public function __construct() {
parent::__construct(); // This is MUST!
}
public function index($journalId) {
$data['journalId'] = $journalId;
$this->view->load('journalPage', $data);
}
}
现在,当你更新了这个,我们来路由配置。
你写的配置行只能混淆CI,仅此而已。
CI路线的结构应该是这样的:
$route['journal/(:any)'] = 'journal/index/$1';
这会将所有来自日志/ [ID]的流量重定向到名为journal的控制器,并使用param [ID]重定向到名为index的方法。
您必须在路由中定义索引部分。
试试这个,一切都应该正常。 欢呼声。
答案 2 :(得分:1)
首先:你不需要创建一个空的构造函数(这是必须的[没有!])。 如果你想在该控制器的所有函数的开头加载一些库,助手或模型,那么它是必需的,否则就不需要。
其他提示:尝试不在控制器功能上传递参数。您可以使用CodeIgniter的URI类来捕获和操作uri值。
这样做:
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Journal extends CI_Controller
{
public function index()
{
$data['journalId'] = $this->uri->segment(2);
$this->view->load('journalPage', $data);
}
}
您最好看一下URI类。这很方便! http://codeigniter.com/user_guide/libraries/uri.html
PS:也不需要在路线上修理任何东西。
拥抱