phpenv默认不自动动静分离,因其nginx配置仅含粗粒度的location ~ \.php$,未为.js、.css、.jpg等静态后缀设置独立location块,也未启用try_files或expires,导致所有非根请求均fallback至php-fpm处理,造成静态资源被错误转发、返回404或空白响应。

phpEnv 是 Windows 下的集成环境套件,它把 Nginx、PHP、MySQL 打包在一起,开箱即用,但默认配置不区分动静态资源,所有 .php 请求都走 PHP-FPM,导致图片、CSS、JS 等静态文件也经由 PHP 处理,白白消耗 FPM 进程和响应时间——这不是“转发问题”,而是没做动静分离。
为什么 phpEnv 的 Nginx 默认不自动动静分离
phpEnv 的 Nginx 配置(通常在 phpEnv\nginx\conf\vhost\default.conf 或类似路径)一般只有一段粗粒度的 location ~ \.php$,没有为 .jpg、.css、.js 等后缀设置独立 location 块,也没有启用 try_files 或 expires。这意味着:即使文件物理存在,Nginx 仍会把请求交给 PHP-FPM,而 PHP-FPM 发现不是 PHP 脚本就直接返回 404 或空白响应。
- 典型现象:
http://localhost/style.css返回 404 或空内容,但文件明明在www/目录下 - 根本原因:Nginx 没配静态文件直出规则,所有非
/请求都 fallback 到 PHP 处理 - phpEnv 的 Nginx 版本较旧(常为 1.16+),不支持
location ^~ /static/这类高级匹配时,更需靠后缀精准拦截
手动加 location ~* \.(js|css|png|jpg|gif|ico|woff2?)$ 规则
在 server 块里、location ~ \.php$ 之前插入以下配置,让 Nginx 直接服务静态资源,不碰 PHP-FPM:
location ~* \.(js|css|png|jpg|gif|ico|woff|woff2|ttf|eot|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
root "D:/phpEnv/www";
}
-
~*表示不区分大小写匹配,避免.JPG被漏掉 -
root必须指向你的实际 Web 根目录(如D:/phpEnv/www),不能写成$document_root—— phpEnv 的$document_root在部分版本中解析异常 - 删掉或注释掉可能存在的
location /里重复的try_files $uri $uri/ /index.php?$args;,否则它会覆盖上面的静态规则 - 如果用了 Laravel 等框架,且入口是
public/,则root应设为D:/phpEnv/www/public,否则favicon.ico可能 404
确保 .php 请求只进 PHP-FPM,不被静态规则误伤
phpEnv 的默认 PHP 处理块常写成 location ~ \.php,这会错误匹配 script.php.bak 或 config.php.swp 等敏感备份文件。必须收紧为:
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME "D:/phpEnv/www$fastcgi_script_name";
include fastcgi_params;
}
- 结尾的
$很关键:~ \.php$匹配以.php结尾的 URI,排除.phpinfo、.phps等扩展名 -
SCRIPT_FILENAME必须用绝对路径拼接,phpEnv 中$document_root不可靠,硬编码更稳 - 确认
fastcgi_params文件存在(通常在phpEnv\nginx\conf\fastcgi_params),里面应含fastcgi_param SCRIPT_NAME和fastcgi_param PATH_INFO,否则 Laravel 路由会失效
验证动静分离是否生效
改完配置后,用 nginx -t 测试语法(phpEnv 自带命令行可执行),再重启 Nginx。验证方式很简单:
- 访问
http://localhost/test.js,看响应头是否有Cache-Control: public, immutable和200 OK,且内容正确 - 访问
http://localhost/info.php,看是否显示 PHP 信息页,且响应头不含X-Powered-By: PHP(说明没被静态规则截胡) - 用 Chrome DevTools → Network → 切换到
Size列,对比.php和.css的Time:前者应在 20–100ms(含 PHP 解析),后者应 - 最关键的漏点:检查
http://localhost/.env是否 404 —— 如果返回内容,说明location ~ \.php$写错了,或没加$锚定,已暴露敏感文件
动静分离不是“多加几行就完事”,核心在于规则顺序、锚点符号、路径拼接三者咬合。phpEnv 的配置惯性大,改一处常牵出三处隐性依赖,动手前先备份原 default.conf。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











