windows 11下nginx 1.30.5+php 8.2.32伪静态核心是用try_files兜底、root指向public目录、正确传递script_filename,禁用if+rewrite老写法,并按thinkphp/laravel/wordpress等框架微调配置。

Windows 11 下用 Nginx 1.30.5 搭配 PHP 8.2.32 配置伪静态,核心不是堆规则,而是路径对、入口准、转发稳、写法简。重点不在 if + rewrite 的老套路,而在于用 try_files 做兜底 + 正确传递 SCRIPT_FILENAME + ThinkPHP/Laravel/WordPress 等框架适配到位。下面直给可落地的步骤,不绕弯。
确认基础环境已跑通
伪静态生效的前提是 PHP 能正常响应 .php 文件:
- 确保
php-cgi.exe -b 127.0.0.1:9000 -c C:\php\php.ini已后台运行(任务管理器可见进程) - Nginx 的
nginx.conf中location ~ \.php$块必须包含三行关键参数:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;<br>fastcgi_param PATH_INFO $fastcgi_path_info;<br>fastcgi_param QUERY_STRING $query_string;
- 在网站根目录放
info.php,内容为<?php phpinfo(); ?>,访问http://localhost/info.php能显示页面才算基础就绪
伪静态配置首选 try_files(推荐所有项目)
把传统 if (!-e $request_filename) { rewrite ... } 全部替换掉——它在 Windows 下易因大小写、路径分隔符或空 PATH_INFO 导致白屏,尤其 ThinkPHP 8+ 和 Laravel。
在 server 块内、location / 中写:
location / {<br> index index.php index.html;<br> try_files $uri $uri/ /index.php?$query_string;<br>}
-
$uri:先查真实文件(如 logo.png) -
$uri/:再查目录(如 /admin/) -
/index.php?$query_string:都不命中,才交由 index.php 处理,且完整保留 GET 参数
注意:root 必须指向 public 目录(如 ThinkPHP 8、Laravel),不能是项目根目录;否则 $document_root 解析错误,SCRIPT_FILENAME 拼出路径失效,直接空白页。
按框架类型补关键配置
不同框架对 URL 解析方式不同,需微调:
-
ThinkPHP 8.x:确保
config/app.php中'url_route_on' => true,并关闭if写法;Nginx 不需要额外 PATH_INFO 提取,try_files+ 默认 fastcgi_params 即可 -
Laravel:同上用
try_files;若部署在子目录(如http://localhost/myapp/),则 location 改为location /myapp/,并在try_files后加前缀:try_files $uri $uri/ /myapp/index.php?$query_string; -
WordPress:不用 if 判断,直接在
location /写:try_files $uri $uri/ /index.php?$args;;同时 WordPress 后台「设置 → 固定链接」选「朴素」以外任意模式即可生效
调试与排错要点
伪静态失败,90% 出在路径或日志盲区:
- 运行
nginx -t校验语法,成功后再nginx -s reload - 打开 Nginx 重写日志(临时加在
http或server块):rewrite_log on;<br>error_log logs/rewrite.log notice;
重启后访问测试链接,查看logs/rewrite.log是否记录匹配与跳转 - 检查
error.log,搜索关键词:
–Primary script unknown→SCRIPT_FILENAME路径错,检查root和$document_root
–FastCGI sent in stderr→ PHP 执行崩溃,可能是框架入口未加载,确认 public 目录为 root - 浏览器 F12 → Network 标签,看请求状态码:404 是没匹配到任何 location;500 是 PHP 报错;200 但空白是框架未启动(多半 PATH_INFO 或路由开关问题)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











