根本原因在于php -s启动的是php内置服务器,不支持.htaccess;要使其生效,必须使用xampp的apache服务,修改httpd.conf中listen端口、servername、allowoverride all,并确保mod_rewrite已启用且无端口冲突,最后重启apache。

.htaccess 文件在 XAMPP 多端口配置下不会“递归生效”——它根本不会生效,因为你在用 PHP 内置服务器跑端口,压根没走 Apache。
为什么 localhost:3122 下 .htaccess 完全没反应
你执行的是 php -S localhost:3122,这启动的是 PHP 自带的轻量级开发服务器,和 Apache 无关。.htaccess 是 Apache 特有的分布式配置文件,PHP 内置服务器不解析、不读取、不支持任何 .htaccess 指令。
- 现象:URL 重写失效、
RewriteRule被忽略、Deny from不起作用、ErrorDocument不跳转 - 原因:
php -S只能路由到一个 PHP 入口文件(如router.php),没有模块机制,更无mod_rewrite - 验证方式:访问任意不存在路径,返回的是 PHP 默认的 “No input file specified” 或白屏,而非 Apache 的 404 页面或自定义错误页
想让 .htaccess 生效,必须走 Apache + 正确端口监听
要让 .htaccess 起作用,就得用 XAMPP 的 Apache 服务,并把它监听到你想要的端口(比如 3122),而不是用 php -S。
- 编辑
XAMPP\apache\conf\httpd.conf,把Listen 80改成Listen 3122 - 同步修改
ServerName localhost:80→ServerName localhost:3122 - 确认
LoadModule rewrite_module modules/mod_rewrite.so这行已取消注释 - 找到
<directory></directory>段落,把里面的AllowOverride None改成AllowOverride All - 如果项目不在
htdocs下(比如在C:\xampp\htdocs\woski),需额外确保该目录的父级<directory></directory>块也设置了AllowOverride All - 重启 Apache(不是重启控制面板,是点 Stop 再 Start)
改端口后访问不到?检查三个硬性依赖点
即使改了 Listen 和 ServerName,Apache 仍可能启动失败或响应异常,常见卡点:
-
httpd-ssl.conf里还有Listen 443—— 如果你没启用 HTTPS,直接注释掉整段 SSL 配置;如果启用了,必须同步改成未被占用的端口(如Listen 8443)并更新所有_default_:443为_default_:8443 - Windows 系统中 Skype、IIS、Web Deploy 或其他软件占用了 3122 端口 —— 运行
netstat -ano | findstr :3122查进程 ID,再用taskkill /PID xxx /F杀掉 - 防火墙或杀毒软件拦截了非标端口 —— 临时关闭测试,或手动放行该端口
别混淆虚拟主机和多端口:它们解决的是不同问题
虚拟主机(VirtualHost)靠 Host Header 区分请求,适合同一端口跑多个域名(如 project1.test 和 api.local);而改 Listen 是让 Apache 绑定新端口,适合隔离环境或绕过端口冲突。两者可共存,但不能互相替代。
- 如果你只是想让
woski项目独占一个端口且用.htaccess,就只改httpd.conf的Listen和AllowOverride,不用碰httpd-vhosts.conf - 如果你同时需要多个项目、多个域名、多个端口混合使用,才需要组合配置
VirtualHost+Listen+ServerName - 注意:
DocumentRoot必须指向真实物理路径(如C:/xampp/htdocs/woski),不能只写相对路径或漏掉盘符
真正容易被忽略的是:改完配置后没重启 Apache,或者重启了但没看 Apache error log(位于 XAMPP\apache\logs\error.log)——那里会明确告诉你哪一行配置出错、哪个模块加载失败、哪个端口被拒绝绑定。











