win7下nginx伪静态生效需将rewrite规则置于location ~ .php$块内并用last标志,确保root路径一致、script_filename正确、php-cgi带-c参数启动且cgi.fix_pathinfo=1。

Win7 下用 Nginx 搭建 PHP 环境时,伪静态(即 URL 重写)本身不依赖 PHP,而是由 Nginx 的 rewrite 指令在请求到达 PHP 前就完成路径转换。只要 Nginx 配置正确、PHP 能正常响应,伪静态就能生效 —— 但 Win7 上容易卡在路径解析、正则匹配或 fastcgi 传递环节。
nginx.conf 里 location ~ \.php$ 块必须包含 rewrite 规则
伪静态规则不能只写在 server 根层级,必须放在能捕获 PHP 请求的 location 块内,否则 rewrite 后的 URI 不会被转发给 PHP-CGI。常见错误是把 rewrite 写在 location / 里,结果请求进来了,但 PHP 根本没收到重写后的路径。
-
location /块里可写通用跳转(如域名跳转),但不处理 PHP 路由逻辑 - 所有面向 PHP 的重写(如 ThinkPHP 的
index.php/xxx或 WordPress 的/post-name/)必须放进location ~ \.php$或更宽泛的location ~ \.php(/|$) - Win7 下推荐显式用
last标志,避免因路径拼接出错导致 404:rewrite ^/article/(\d+)\.html$ /index.php?aid=$1 last;
Windows 路径分隔符和 root 配置影响 rewrite 结果
Win7 文件系统用反斜杠 \,但 Nginx 配置中所有路径必须用正斜杠 /;且 $document_root 的值必须与 root 指令完全一致,否则 rewrite 后的 SCRIPT_FILENAME 会指向错误位置,报 No input file specified。
- 检查
location ~ \.php$中的root是否和location /一致,例如都设为root D:/www;,不要混用D:\www或D:/www/(末尾斜杠不影响,但一致性可避坑) -
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;这行不能注释,也不能写成/scripts$fastcgi_script_name—— Win7 下尤其敏感 - 若用子目录部署(如
http://localhost/myapp/),rewrite 规则要带前缀,且root应指向物理路径,不是 URL 路径
伪静态生效但 PHP 报 404?检查 php-cgi.exe 启动方式和扩展
Nginx 重写成功,但 PHP 层仍返回 404,大概率是 PHP 自身路由未识别路径,或关键扩展未启用。Win7 下常见于 pathinfo 支持缺失或 php.ini 配置未生效。
- 确保
php.ini中开启cgi.fix_pathinfo = 1(默认是 1,但某些旧版包可能为 0) - 确认已启用
extension=php_mbstring.dll和extension=php_pdo.dll,多数框架依赖它们解析 PATH_INFO - 启动 php-cgi.exe 时必须带
-c参数指定 php.ini 路径,例如:"D:/php/php-cgi.exe" -b 127.0.0.1:9000 -c "D:/php/php.ini",否则读的是默认配置 - 测试是否支持 pathinfo:写个
test.php,内容为<?php var_dump($_SERVER['PATH_INFO']); ?>,访问/test.php/abc,有输出才说明底层通了
Win7 下 rewrite 正则容易忽略的细节
Win7 自带的 Nginx 版本(如 1.6–1.10)对 PCRE 支持较老,部分现代正则语法不兼容,且大小写敏感行为需明确控制。
- 避免用
^/([a-z]+)/?$这类纯小写模式,加i标志更稳妥:rewrite ^/([a-z]+)/?$ /index.php?m=$1 last; - 不要用
\K、?非贪婪等高级语法,Win7 下 Nginx 多数编译自旧版 PCRE,不支持 - 中文路径重写需确保 Nginx 编译时启用了 UTF-8 支持(官方 Windows 二进制包默认支持),但 URL 中中文建议先 urlencode,否则易乱码
- 修改完
nginx.conf后,务必用nginx -t测试语法,再nginx -s reload—— Win7 下直接双击 nginx.exe 启动时,reload 可能不生效,需手动 kill 进程再启
Win7 系统老旧,Nginx + PHP 组合对路径解析、编码、信号处理都比现代系统更脆弱。伪静态真正卡点往往不在 rewrite 语句本身,而在 root、SCRIPT_FILENAME、php-cgi 启动参数三者是否严丝合缝 —— 少一个斜杠、多一个空格、缺一个 -c,都可能导致“规则写了却没反应”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











