macOS上用MAMP跑Yii2,核心是DocumentRoot必须指向web/子目录、启用mod_rewrite并配置AllowOverride All、数据库连接使用127.0.0.1或指定MAMP MySQL socket路径,三者缺一不可。

macOS上用MAMP跑Yii2,核心不是“能不能启动”,而是Web根目录指向、重写支持、数据库连接路径这三点对不对。错一个,轻则404、白屏,重则敏感目录暴露或数据库连不上。
DocumentRoot必须指向web/子目录
MAMP默认把项目放/Applications/MAMP/htdocs/,但Yii2的入口不在项目根,而在web/子目录。直接把整个项目拖进htdocs,Apache会把config/、controllers/这些目录暴露在Web下,极不安全。
- 正确做法:在MAMP GUI里选中站点 → “Host Settings” → “Document Root”,填绝对路径,例如/Users/yourname/myproject/web
- 若用MAMP Pro,也可在httpd.conf或虚拟主机配置中手动写:DocumentRoot "/Users/yourname/myproject/web"
- 改完务必重启MAMP(不是刷新页面),否则配置不生效
必须启用mod_rewrite并允许.htaccess解析
Yii2的友好URL(如/site/about)依赖Apache通过.htaccess做前端控制器转发。MAMP默认禁用该功能,导致路由根本到不了PHP。
- 打开/Applications/MAMP/conf/apache/httpd.conf,确认以下两行已取消注释:
LoadModule rewrite_module modules/mod_rewrite.so
Include /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf - 在对应虚拟主机的
块内添加:AllowOverride All - 检查web/.htaccess是否存在且内容为Yii2官方标准版本(含RewriteEngine On和正确的RewriteRule)
数据库连接要用MAMP的MySQL socket或IP
MAMP的MySQL不走系统默认socket(/tmp/mysql.sock),直接用localhost可能报错No such file or directory。
- 推荐方式:用127.0.0.1代替localhost,避免Unix socket查找失败
- 或显式指定socket路径,在common/config/main-local.php中这样写:
'dsn' => 'mysql:host=127.0.0.1;port=8889;dbname=yii2advanced',
其中8889是MAMP MySQL端口(可在MAMP偏好设置里查) - 确保pdo_mysql扩展已在MAMP对应PHP版本的php.ini中启用
vendor/autoload.php必须能被正确加载
如果访问时提示Class 'yii\web\Application' not found,大概率是自动加载路径断了。
- 确认项目结构为标准格式:
myproject/
├── web/
│ └── index.php
├── vendor/
├── composer.json
└── ... - 检查web/index.php第一行:require __DIR__ . '/../vendor/autoload.php'; —— 这个../是相对于web/的,所以vendor/必须与web/同级
- 不要用localhost:8888/myproject/web/这种子路径访问,会导致相对路径全部错位


















