2

谁能解释这个 mod_rewrite 规则在做什么?

我正在尝试评论该文件,但代码似乎与我认为它正在做的相反

# Enable rewriting of URLs
RewriteEngine on


# Allow specified file types to be accessed
# Thing to test = URL
# Condition = not starting with  
RewriteCond $1 !^(index\.php|images|css|js|robots\.txt)


# RewriteRule will only be performed if the preceeding RewriteCond is fulfilled
# Remove index.php from all URLs     
# Pattern = anything (0 or more of any character)
# Substitution = index.php + the rest of the URL    
RewriteRule ^(.*)$ /index.php/$1 [L]  
4

3 回答 3

5

浏览器向服务器发送请求(Apache,因为您使用的是 mod_rewrite):

获取个人资料/编辑

Apache 接受此请求并在其配置文件中看到您已将其配置为通过 mod_rewrite 传递所有请求。因此,它将字符串“profile/edit”发送到 mod_rewrite。Mod_rewrite 然后将您指定的规则应用于它,然后将请求(以我在上一篇文章中解释的方式)转换为“index.php/profile/edit”。mod_rewrite 完成后,Apache 继续处理请求,并看到“哦,这家伙正在请求文件 index.php”。所以它调用 php 解释器,然后解析并执行 index.php - 并获取 '/profile/edit' 作为参数。php 代码(在您的情况下为 CI)解析这些参数并知道如何在您的应用程序中调用正确的模块。

所以基本上,这是一种始终调用 index.php 的方法,即使 url 没有指定 index.php。这样,index.php 作为前端控制器工作:它将所有请求路由到应用程序中的正确位置。

于 2008-10-07T17:22:02.280 回答
4
^ = begin of line
( = begin group
.* = any character, any number of times
) = end group

第二部分中的 $1 被第一部分中的组替换。

这是 Symfony 规则吗?思路是将整个查询字符串作为参数传递给 index.php(前端控制器),以便前端控制器对其进行解析和路由。

于 2008-10-07T16:57:40.020 回答
2

如果 URL 不是以 index.php 或 images 或 css 或 js 或 robots.txt 开头,则以字符串“/index.php/”为前缀。

由于 index.php 可能是一个可执行的 php 应用程序,因此 index.php 可以从其 cgi 环境中读取 URL 的其余部分。(它存储在 ${PATH_INFO} 中)

于 2008-10-07T16:56:08.680 回答