Apache的URL重写需手动启用mod_rewrite模块、配置AllowOverride All授权.htaccess,并编写含RewriteEngine On及条件规则的重写逻辑,调试时应检查错误日志与响应状态码。

Apache 的 URL 重写(mod_rewrite)不是开箱即用的功能,需要手动启用模块、开启重写引擎,并编写规则。配置本身不复杂,但细节容易出错,比如权限限制、.htaccess 生效条件、正则表达式语法等。
确认 mod_rewrite 模块已加载
URL 重写依赖 mod_rewrite 模块。先检查是否已启用:
- Linux(使用 systemctl):运行
httpd -M | grep rewrite或apache2ctl -M | grep rewrite,看到rewrite_module (shared)表示已加载 - Windows:打开
httpd.conf,确认这行未被注释:LoadModule rewrite_module modules/mod_rewrite.so - 若未启用,需在配置文件中取消注释该行,然后重启 Apache
允许 .htaccess 中使用重写规则
默认情况下,Apache 禁止目录级重写。要在网站根目录用 .htaccess 文件写规则,必须在对应 <Directory> 块中显式授权:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 编辑主配置文件(如
/etc/apache2/sites-enabled/000-default.conf或C:\Apache24\conf\httpd.conf) - 找到网站文档根目录的
<Directory "/var/www/html">(或 Windows 下类似路径)区块 - 确保包含这两行:
AllowOverride AllRequire all granted - 注意:
AllowOverride None会完全忽略 .htaccess,即使文件存在也不生效
编写基础重写规则
规则写在 .htaccess(推荐用于开发环境)或主配置文件的 <Directory> / <Location> 块中。一个典型例子是隐藏 .php 后缀:
- 在网站根目录新建或编辑
.htaccess - 添加以下内容:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
说明:
-
RewriteEngine On是开关,必须放在最前面 -
RewriteCond是前置条件,这里表示“请求的不是真实存在的文件或目录” -
RewriteRule是核心规则:^(.*)$匹配全部路径,重写为index.php?url=... -
[QSA,L]是标志:QSA保留原有查询参数,L表示这是最后一条规则
调试与验证技巧
重写失败常见原因包括语法错误、权限未放开、模块未加载。快速定位问题的方法:
- 启用重写日志(仅限开发环境):在主配置中加
RewriteLogLevel 3和RewriteLog "/path/to/rewrite.log"(Apache 2.4+ 已弃用,改用RewriteLog替代方案见官方文档) - 更实用的是查看 Apache 错误日志:
tail -f /var/log/apache2/error.log(Ubuntu)或logs/error.log(Windows) - 用
curl -I http://localhost/xxx查看响应头,确认是否发生重定向(301/302)还是内部重写(200) - 临时在 .htaccess 中加一行无效规则(如
RewriteRule ^test$ broken),如果报 500 错误,说明规则语法被解析,模块已生效

















