Mac本地MAMP配ThinkPHP伪静态,必须改Nginx server块配置,root指向public/目录,并用try_files $uri $uri/ /index.php?s=$uri&$args;,.htaccess在Nginx模式下完全无效。

Mac本地MAMP环境配ThinkPHP伪静态,别碰.htaccess——它在MAMP PRO里基本不生效,尤其Nginx模式下完全被忽略;真正起效的是改Nginx主配置模板,且root必须指向public/目录。
为什么MAMP里.htaccess写了也404
MAMP PRO默认用Nginx做前端代理,而Nginx压根不读.htaccess文件。即使你切到Apache模式,也得手动勾选“Enable .htaccess files”,否则规则被直接跳过。更常见的情况是:你把.htaccess放错了位置——ThinkPHP 6+入口在public/index.php,但.htaccess必须放在public/目录下,不是项目根目录。
- Apache模式下没勾选“Enable .htaccess files” → 规则无效
- Nginx模式下放
.htaccess→ 完全无视,连日志都不记 -
.htaccess放在项目根目录(含application/的那层)→ 请求根本进不到public/,index.php都加载不了 - 规则里漏了
[QSA]→?from=wechat这类参数直接丢掉
MAMP PRO Nginx模式下必须改server块
进入File → Edit Template → Nginx,找到你站点对应的server块,在location /里替换或补全以下三段:
location / {
try_files $uri $uri/ /index.php?s=$uri&$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
关键点:
立即学习“PHP免费学习笔记(深入)”;
-
root指令必须指向你的public/目录,比如root /Applications/MAMP/htdocs/myapp/public;;如果指向项目根目录,/index.php会404 -
try_files $uri $uri/ /index.php?s=$uri&$args;中的&是HTML实体,配置文件里必须写成&,写&会报nginx: [emerg] invalid number of arguments in "fastcgi_param" directive -
location ~ \.php$块里的try_files $uri =404不能省,否则/admin/login这种路径会被当成PHP文件去匹配,结果找不到就直接404
框架层配置必须和服务器规则对齐
服务器转发对了,框架接不住照样404。重点检查两个地方:
- TP6:
config/app.php中'route_enable' => true,且'url_common' => false(关掉普通URL模式) - TP5:
config/app.php中'url_route_on' => true,并确认'pathinfo_depr' => '/'(和Nginx规则里s=$uri的斜杠分隔一致) - 访问
http://localhost:8888/index/index能打开,但http://localhost:8888/index404 → 说明PATH_INFO没传进来,此时要回看Nginx配置里是否漏了fastcgi_param PATH_INFO $fastcgi_path_info;(TP5 PathInfo模式必需)
调试时最该先看的三件事
别急着改配置,先快速验证基础链路是否通:
- 在
public/index.php顶部加var_dump($_SERVER['REQUEST_URI'] ?? 'MISSING', $_GET['s'] ?? 'NO S');die;,访问任意URL看输出——如果$_GET['s']为空,说明Nginx没把路径塞进s参数 - 执行
nginx -t确认语法无误,再sudo /Applications/MAMP/Library/bin/nginx -s reload重载(MAMP PRO界面里的重启按钮有时不触发Nginx重载) - 用
curl -I http://localhost:8888/test看返回头,Status不是200而是301/404,说明重定向循环或路径错位,立刻检查root和try_files顺序
最容易被忽略的是root指向和&写法——前者错一格整个请求就掉进404黑洞,后者少一个字符Nginx直接拒绝启动。



















