MVC前端控制器.htaccess配置:两种Rewrite规则的差异咨询
两个MVC前端控制器.htaccess配置的核心差异
嘿,这两个配置都是为了实现MVC架构里的前端控制器(把非静态资源请求统一转发到index.php处理),但它们的逻辑细节和适用场景有明显区别,咱们一步步拆解:
配置一的运行逻辑
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.+)$ index.php/$1 [L]
这个配置的核心是把请求路径作为PATH_INFO传递给index.php:
- 先判断请求的不是真实存在的目录(
!-d),也不是真实存在的文件(!-f) - 满足条件时,会把原始请求的完整路径(比如
/article/1001)直接追加到index.php后面,变成index.php/article/1001 - 你的PHP代码可以通过
$_SERVER['PATH_INFO']拿到/article/1001这个部分,用来解析对应的路由规则
举个实际例子:用户访问http://your-site.com/post/2024,实际会被转发到http://your-site.com/index.php/post/2024,框架通过PATH_INFO识别要调用的控制器和方法。
配置二的运行逻辑
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule !\.(css|js|icon|zip|rar|png|jpg|gif|pdf)$ index.php [L]
这个配置的核心是仅转发非指定静态资源的请求到index.php,且不会传递PATH_INFO:
- 同样先判断请求的不是真实目录/文件
- 额外增加了规则:如果请求的URL后缀不在
(css|js|icon|zip|rar|png|jpg|gif|pdf)列表里,才会转发到index.php - 此时你的PHP代码需要通过
$_SERVER['REQUEST_URI']获取原始请求的完整URL(比如/article/1001),再进行路由解析
举个例子:用户访问http://your-site.com/post/2024会被转发到index.php;但如果访问http://your-site.com/style.css(哪怕这个文件不存在),因为后缀是.css,不会被转发,直接返回404。
核心差异对比
- 路由信息传递方式:配置一用
PATH_INFO(路径挂在index.php后),配置二靠REQUEST_URI获取原始URL。部分老框架依赖PATH_INFO,而现代框架大多支持从REQUEST_URI解析路由。 - 静态资源处理边界:
- 配置一只要是真实存在的文件/目录就不重写,不管后缀;如果请求一个不存在的
.css文件,会被转发到index.php。 - 配置二明确排除了指定后缀的请求,哪怕这些后缀的文件不存在,也不会转发到index.php,直接返回404。
- 配置一只要是真实存在的文件/目录就不重写,不管后缀;如果请求一个不存在的
- 服务器依赖:配置一可能需要服务器开启
AcceptPathInfo选项,才能让index.php正确处理PATH_INFO;配置二则不需要这个设置。
适用场景
- 配置一适合依赖PATH_INFO的传统PHP框架,或者你自己的代码已经基于PATH_INFO实现了路由解析。
- 配置二更适合现代MVC架构,能精准控制哪些静态资源类型不触发路由逻辑,避免无效请求进入PHP代码(比如爬虫请求不存在的
.pdf文件)。但要注意:如果新增了其他静态资源类型(比如.svg),需要手动把后缀添加到RewriteRule的排除列表里。
内容的提问来源于stack exchange,提问作者dwpu
相关产品推荐
相关产品推荐

