Windows下PHP伪静态必须四者协同:匹配服务器类型(Apache/Nginx/IIS)、正确加载模块、规则写对位置、入口路径准确。Apache需启用rewrite模块、AllowOverride All及Require all granted;Nginx须root指向public目录、用try_files替代if重写;IIS必装URL Rewrite Module并配置web.config;phpStudy则走httpd.ini路线,不识别.htaccess。

Windows 下 PHP 伪静态不是“开个开关就行”,而是必须匹配服务器类型(Apache/Nginx/IIS)+ 正确加载模块 + 规则写对位置 + 入口路径准确,四者缺一不可。
Apache 环境下 .htaccess 不生效的典型原因
很多用户把 .htaccess 放进项目根目录却毫无反应,根本不是规则写错,而是 Apache 根本没读它。
- 检查
httpd.conf中是否已启用模块:LoadModule rewrite_module modules/mod_rewrite.so—— 行首不能有# - 找到对应项目目录的
<directory></directory>块(比如<directory></directory>),确认包含:AllowOverride All和Require all granted(Apache 2.4+) -
.htaccess文件名必须严格为.htaccess(Windows 资源管理器默认隐藏扩展名,建议用 VS Code 或 Notepad++ 新建并另存为,编码选 UTF-8 无 BOM) - 规则示例(将
/user/123映射到index.php?_url=/user/123):RewriteEngine On<br>RewriteCond %{REQUEST_FILENAME} !-f<br>RewriteCond %{REQUEST_FILENAME} !-d<br>RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L]
Nginx 在 Windows 下白屏或 404 的关键点
ThinkPHP、Laravel 等框架在 Windows + Nginx 下伪静态失败,90% 是因为 root 指向错误或 try_files 写法不兼容。
-
root必须指向public/目录(如root D:/www/myapp/public;),绝不能是项目根目录 - 禁用
if (!-e $request_filename) { rewrite ... }写法 —— Windows 对路径大小写和分隔符敏感,$_SERVER['PATH_INFO']极易为空,导致路由解析失败 - 推荐用标准
try_files:location / {<br> try_files $uri $uri/ /index.php?$query_string;<br>} - 确保 fastcgi_param 配置完整(尤其
SCRIPT_FILENAME):fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
IIS7+ 需手动安装 URL Rewrite Module 才能识别 .htaccess
Windows 自带 IIS 默认不支持重写规则,.htaccess 文件放进去完全被忽略。
立即学习“PHP免费学习笔记(深入)”;
- 必须从 IIS 官网 下载并安装
URL Rewrite Module(注意 x64/x86 位数匹配系统) - 安装后重启 IIS Manager,在站点右侧打开
URL Rewrite模块 - 点击“导入规则”,选择框架提供的
.htaccess(如 ThinkPHP 的规则),或手动填写web.config(IIS 唯一认的配置文件) - 示例
web.config片段(放在站点根目录):<configuration><br> <system.webServer><br> <rewrite><br> <rules><br> <rule name="Imported Rule 1" stopProcessing="true"><br> <match url="^(.*)$" ignoreCase="false" /><br> <conditions logicalGrouping="MatchAll"><br> <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" /><br> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" /><br> </conditions><br> <action type="Rewrite" url="index.php?url={R:1}" appendQueryString="true" /><br> </rule><br> </rules><br> </rewrite><br> </system.webServer><br></configuration>
phpStudy 等一键环境的特殊处理
phpStudy 默认禁用 .htaccess,且 Windows 下不识别该文件名 —— 它走的是 Apache 的 httpd.ini 路线。
- 修改
httpd.conf:取消注释LoadModule rewrite_module modules/mod_rewrite.so,并将对应<directory></directory>块中的AllowOverride None改为All - 在
httpd.conf最后追加:<IfModule mod_rewrite.c><br>RewriteEngine On<br>RewriteRule ^(.*)-htm-(.*)$ $1.php?$2<br></IfModule>
(这是 phpStudy 认的伪静态入口,规则写在这里而非.htaccess) - 重启 Apache —— 不是点“重启服务”,而是右键托盘图标 → “重启 Apache”
- 若仍无效,检查 phpStudy 控制面板中 Apache 版本(2.2/2.4),对应调整权限指令:
Order Allow,Deny+Allow from all(2.2) 或Require all granted(2.4)
最容易被忽略的是:不同服务器对 $_SERVER 变量的填充方式完全不同 —— Apache 默认填 PATH_INFO,Nginx 默认不填(得靠 fastcgi_param 补),IIS 默认填 REQUEST_URI。框架路由层依赖哪个变量,就决定了你该配哪条规则、在哪改哪行参数。



















