根本原因是多端口 virtualhost 中未为每个端口单独配置 块并设置 allowoverride all、require all granted 和 options +followsymlinks,导致该端口下 .htaccess 被忽略。

为什么改了 Apache 端口后 .htaccess 突然不生效
根本原因不是端口本身,而是 httpd.conf 中的 AllowOverride 配置块没跟着端口变更同步更新——尤其当你用 VirtualHost 定义了多个监听端口时,每个 <virtualhost></virtualhost> 块都必须单独配 AllowOverride All,否则该端口下的所有伪静态规则都会被忽略。
常见错误现象:80 端口下 .htaccess 正常,但切到 8080 后访问 /article/123 直接 404 或跳转到 index.php;error.log 里没有 rewrite 错误,说明模块已加载,但规则压根没进引擎。
- Apache 默认只在主
<directory></directory>块(通常指向htdocs)设了AllowOverride All,而新增的<virtualhost></virtualhost>块里若没显式声明<directory></directory>,就会沿用全局默认值AllowOverride None - Windows 下路径斜杠写成单反斜杠
\会导致<directory></directory>解析失败,Apache 启动不报错但配置无效 - 如果用了
RewriteBase,它的路径必须和VirtualHost的实际请求路径一致;比如http://localhost:8080/blog/就得写RewriteBase /blog/,而不是/
多端口下 VirtualHost 必须显式配 Directory 权限
不能依赖主配置里的 AllowOverride 设置。每个监听不同端口的 <virtualhost></virtualhost> 都要独立加 <directory></directory> 块,并确保包含三要素:AllowOverride All、Require all granted、Options +FollowSymLinks(缺一不可)。
示例(放在 httpd-vhosts.conf 中):
XAMPP 8.0.30 是一款免费、开源的跨平台 Web 服务器集成包,专为快速搭建本地 PHP 开发环境而设计。该版本核心组件包括:Apache 2.4.56、MySQL 8.0.33、PHP 8.0.30、phpMyAdmin 5.2.1 等。它支持 Windows、Linux 和 macOS 系统,可让开发者在个人电脑上轻松模拟服务器环境,无需复杂配置即可运行 WordPress、Thin
RewriteEngine On
<virtualhost>
DocumentRoot "C:/xampp/htdocs/blog"
ServerName localhost:8080
<directory>
AllowOverride All
Require all granted
Options +FollowSymLinks
</directory></virtualhost>
- 路径统一用正斜杠
/,避免 Windows 转义问题 -
Options +FollowSymLinks是必须项,否则RewriteCond %{REQUEST_FILENAME} !-f这类判断会直接报错:"Options FollowSymLinks or SymLinksIfOwnerMatch is off" - 修改后必须重启 Apache,
bt reload或 XAMPP Control Panel 的 Restart 不起作用
伪静态规则里 RewriteBase 怎么写才不翻车
RewriteBase 不是“网站根目录”,而是当前 VirtualHost 接收到的 URL 路径前缀。它决定重写后目标脚本的解析起点,写错会导致 index.php 找不到或循环重定向。
- 如果你访问的是
http://localhost:8080/,且站点在htdocs下,RewriteBase就是/ - 如果访问的是
http://localhost:8080/myapp/,且myapp是子目录,RewriteBase必须是/myapp/(结尾斜杠不能省) - WordPress 在非根目录部署时,
RewriteBase和后台「固定链接」设置必须严格一致,否则wp-admin页面全 404 - 调试技巧:临时在 .htaccess 末尾加一行
RewriteRule ^test-base$ - [R=403],访问/test-base看是否返回 403,能快速验证规则是否被加载
检查 rewrite 模块是否真在所有端口生效
光看 apache_get_modules() 返回有 rewrite_module 不够——模块加载是全局的,但启用与否取决于每个 VirtualHost 是否在自己的上下文中调用了 RewriteEngine On。
- 把
RewriteEngine On放到<virtualhost></virtualhost>块内部,而不是只写在 .htaccess 里;否则当AllowOverride None时,.htaccess 完全不执行 - 开启重写日志仅限开发环境:
RewriteLog "logs/rewrite.log"和RewriteLogLevel 3要加在<virtualhost></virtualhost>块内,且 Apache 2.4+ 已废弃该指令,改用RewriteOptions InheritDownBefore配合主配置日志 - 最简验证法:在对应端口的 DocumentRoot 下放一个纯
.htaccess,内容只有RewriteEngine On+RewriteRule ^boom$ - [R=403],访问/boom看是否 403;不是则说明该端口的 rewrite 引擎根本没启动
多端口配置下最容易被忽略的,是每个 VirtualHost 都得自成闭环:模块启用、权限放开、路径基准明确、规则加载位置正确。少一个环节,伪静态就静默失效,连 error.log 都不会报错。










