Yii Framework项目部署遇404错误求助(lighttpd+PHP7环境)
我来帮你排查这个Yii+lighttpd的路由问题——从你描述的情况来看,核心问题出在lighttpd的URL重写规则没有适配Yii的路由逻辑,同时直接访问模块内文件返回500是Yii的正常机制,不用纠结。下面分步骤解决:
1. 修正lighttpd的URL重写规则
你的原规则存在匹配顺序和逻辑覆盖的问题,Yii的标准路由需要把所有非文件/目录的请求统一转发到根目录的index.php,并通过r参数传递路由信息。替换成以下配置:
$HTTP["host"] =~ "mydomain.com" { server.document-root = "/var/yaamp/web" # 确保mod_rewrite模块已加载(全局配置没开的话要加上) server.modules += ( "mod_rewrite" ) url.rewrite-if-not-file = ( # 匹配带ID的路由,比如 /stats/123 "^([^/?]+)/([0-9]+)(?:\?(.*))?$" => "index.php?r=$1&id=$2&$3", # 匹配带查询参数的普通路由,比如 /stats?param=1 "^([^/?]+)(?:\?(.*))?$" => "index.php?r=$1&$2", # 根目录直接指向index.php "^/$" => "index.php" ) url.access-deny = ( "~", ".dat", ".log" ) }
规则说明:
- 优先处理带数字ID的路由场景,避免被后续规则覆盖
- 明确匹配非文件请求,不会干扰直接访问静态资源(比如images/41.png)
- 确保所有路由请求都转发到根
index.php,由Yii统一解析
2. 理解Yii的路由机制(为什么直接访问模块文件会500)
Yii是单入口框架,所有请求必须通过根目录的index.php初始化全局环境(加载框架、配置文件、路由规则)。直接访问yaamp/modules/stats/index.php会跳过这些初始化步骤,导致依赖缺失,所以返回500是正常的。/stats这个路由是由Yii的路由管理器解析,最终指向StatsController.php的actionIndex方法,不需要直接访问模块内的文件。
3. 验证重写规则是否生效
如果修改后还是404,打开lighttpd的调试日志确认重写是否执行:
在lighttpd.conf全局配置中添加:
server.errorlog = "/var/log/lighttpd/error.log" debug.log-request-handling = "enable"
重启lighttpd后访问mydomain.com/stats,查看日志里是否有类似rewrote "/stats" to "/index.php?r=stats"的记录,确认请求是否被正确转发。
4. 检查Yii的URL管理器配置
确保项目的Yii配置文件(通常在protected/config/main.php)中开启了URL美化:
'components' => array( 'urlManager' => array( 'urlFormat' => 'path', 'showScriptName' => false, // 隐藏URL中的index.php 'rules' => array( '<controller:\w+>/<id:\d+>' => '<controller>/view', '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>', '<controller:\w+>/<action:\w+>' => '<controller>/<action>', ), ), // 其他组件配置... )
同时确认StatsController.php的类名正确(首字母大写,继承CController或Yii基类),并且存在actionIndex方法——这是访问/stats时默认触发的动作。
5. 权限检查(兜底项)
虽然你说静态文件能正常访问,但还是要确保lighttpd运行用户(通常是www-data或lighttpd)对项目目录有读取权限:
chown -R www-data:www-data /var/yaamp/web chmod -R 755 /var/yaamp/web
按以上步骤调整后,mydomain.com/stats这类路由应该能正常解析了。
内容的提问来源于stack exchange,提问作者Thread7

