0

我正在为 CodeIgniter 使用 Phil Sturgeon 的 REST 服务器,并希望修改功能以便支持以下 URL:

http://api.example.com/users
http://api.example.com/users/1

分别获取用户列表和单个用户,而不是它支持的那些:

http://api.example.com/users
http://api.example.com/users?id=1

我在他的博客上读到,这应该可以使用 mod_rewrite,但无法按预期工作。

默认的 CodeIgniter .htaccess 如下所示:

RewriteEngine on

RewriteCond $1 !^(index\.php|css|images|js|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

我已经尝试添加自己的规则来尝试实现此功能。这是我希望正常工作的一个。它被放置在 RewriteEngine 激活之后和 CodeIgniter 规则之前。

RewriteRule ^users/([0-9+]) /users?id=$1 [NC]

我认为这将级联到下一个规则,该规则将通过 CodeIgniter 路由,然后点击正确的users.php控制器,然后是index_get方法(由 REST 服务器重新映射)。

相反,我收到一个“未知方法”错误 - 似乎 CodeIgniter 试图将用户整数用作函数,例如users/12它试图12()users.php.

有谁知道这里出了什么问题,或者可以推荐解决这个问题的方法?

4

1 回答 1

1

CodeIgniter 使用前端控制器模式并支持干净的 URL。这意味着它应该能够以您想要的方式透明地获取和路由请求。您应该能够设置您的 Web 服务器以将所有请求路由到 CodeIgniterindex.php并修改它的配置文件以适应。

编辑您的system/application/config/config.php文件并设置 index_page 变量:$config['index_page'] = '';. 然后,在 Apache 中编辑您的.htaccess文件或虚拟主机配置文件以使用以下内容:

# Turn on the rewriting engine.
RewriteEngine On
# Default rewrite base to /
RewriteBase /

# Rewrite if the request URI begins with "system":
RewriteCond %{REQUEST_FILENAME} ^system
RewriteRule ^(.*)$ index.php/$1 [NC,L]

# Or if it points at a file or directory that does not exist:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Also rewrite it to the front controller.
RewriteRule ^(.*)$ index.php/$1 [NC,L]

编辑:查看作者本人的这个答案,他说 CodeIgniter 应该默认选择查询字符串或 URI 段样式。

编辑2:啊,我明白你的意思了。您不希望将查询变量名称作为 URI 段。您可以通过修改路由文件来解决此问题,以便它将所有查询发送到该控制器上的单个方法。

于 2012-07-24T07:28:47.287 回答