phpEnv 自带的 Nginx 不支持开箱即用的 UA 判断跳转,必须手动修改 nginx.conf 并启用 if 指令;因其默认编译未完整开启 rewrite 模块、if 被限制在 server/location 块内、rewrite_log 关闭且重启常不生效 Nginx 进程。

直接说结论:phpEnv 自带的 Nginx 不支持开箱即用的 UA 判断跳转,必须手动修改 nginx.conf 并启用 if 指令——但要注意,if 在 location 外使用有隐含限制,且 phpEnv 默认禁用部分 rewrite 功能。
为什么 phpEnv 的 Nginx 默认不生效
phpEnv 封装的 Nginx 版本(多为 1.16–1.20)默认编译时未开启 --with-http_rewrite_module 的完整支持,或配置中被注释/屏蔽了 if 的执行上下文。常见现象是:配置写完、nginx -t 通过,但访问手机 UA 完全无跳转反应。
-
if只能在server或location块内使用,不能放在http块顶层 - phpEnv 的
nginx.conf里常把所有location套在root下,导致 UA 判断逻辑被覆盖或忽略 - 部分 phpEnv 版本默认关闭
rewrite_log on,出错时你根本看不到日志线索
如何正确配置 UA 跳转(以跳转到 /m/ 目录为例)
必须在具体的 server 块内、location / 之前插入判断逻辑,且要用 return 配合完整 URL,避免依赖 rewrite 的 flag 行为。
- 不要用
rewrite ^(.*)$ /m/$1 permanent;—— phpEnv 下容易因$1捕获失败而 404 - 改用
return 302 https://$host/m$request_uri;,确保参数透传 - UA 正则要精简,避免括号嵌套过深;推荐用
~* (mobile|android|iphone|ipad)替代长列表 - 务必加
break或直接用return终止流程,否则可能触发循环重定向
示例片段(插入到你的 server 块开头):
立即学习“PHP免费学习笔记(深入)”;
if ($http_user_agent ~* "(mobile|android|iphone|ipad|blackberry|opera mini)") {
return 302 https://$host/m$request_uri;
}跳转后 /m/ 页面打不开?检查 root 和 index
phpEnv 的 root 通常指向 D:\phpEnv\wwwroot,但 /m/ 是子目录,Nginx 不会自动继承父级的 index 设置。
- 单独为
location /m/显式声明index index.php index.html; - 确认
D:\phpEnv\wwwroot\m\index.php真实存在,且不是空文件或 BOM 头乱码 - 如果用 PHP 脚本做二次判断(如检测
$_SERVER['HTTP_USER_AGENT']),注意 phpEnv 默认关闭user_agent传递,需在fastcgi_param中补上:fastcgi_param HTTP_USER_AGENT $http_user_agent;
最易被忽略的一点:phpEnv 的「重启服务」按钮经常只重启 Apache,Nginx 得手动进任务管理器杀掉 nginx.exe 进程,再双击桌面快捷方式重新启动,否则配置永远不生效。



















