在Linux中配置Apache基础URL重写需三步:启用mod_rewrite模块(如sudo a2enmod rewrite并重启服务),在Directory配置中将AllowOverride None改为All以允许.htaccess生效,最后编写含RewriteEngine On和[L]标记的正确RewriteRule规则。

在 Linux 中配置 Apache 的基础 URL 重写规则,核心就三件事:加载模块、授权目录、写对规则。跳过任意一步,.htaccess 里的重写都不会生效。
启用 mod_rewrite 模块
模块没跑起来,所有规则都是摆设。不能只看配置文件里有没有那行代码,得确认它真在运行。
- Debian/Ubuntu 系统:执行
sudo a2enmod rewrite && sudo systemctl restart apache2 - RHEL/CentOS 系统:编辑
/etc/httpd/conf/httpd.conf,取消注释这行:LoadModule rewrite_module modules/mod_rewrite.so - 验证是否成功:运行
httpd -M | grep rewrite(CentOS)或apache2ctl -M | grep rewrite(Ubuntu),看到rewrite_module (shared)才算到位
允许目录级重写(.htaccess 生效)
即使模块开着,Apache 默认禁止网站目录自己改规则。必须显式放权,否则 .htaccess 里的 RewriteRule 完全被忽略。
- 找到对应站点的
<Directory>配置段(可能在/etc/apache2/apache2.conf、/etc/apache2/sites-enabled/000-default.conf或虚拟主机配置中) - 把
AllowOverride None改成AllowOverride All - 同时确保
Options包含FollowSymLinks(旧版 Apache 必需,新版通常默认支持) - 改完必须重启 Apache:
sudo systemctl restart apache2(Ubuntu)或sudo systemctl restart httpd(CentOS)
编写可运行的 RewriteRule 规则
规则不是越长越好,先让最简逻辑通了,再加条件。记住两个铁律:RewriteEngine On 必须是第一行;多数情况下结尾要加 [L] 表示终止匹配。
- 在网站根目录新建或编辑
.htaccess文件(注意文件名就是.htaccess,无后缀) - 最简结构示例(把
/article/123.html映射为article.php?id=123):<IfModule mod_rewrite.c><br> RewriteEngine On<br> RewriteRule ^article/([0-9]+)\.html$ article.php?id=$1 [L]<br></IfModule>
- 常见标记说明:
—[L]:匹配成功后停止后续规则处理
—[R]:强制外部跳转(浏览器地址栏会变),加[R=301]表示永久重定向
—[NC]:不区分大小写
—[QSA]:保留原始查询参数(比如?utm_source=abc不丢)
调试与验证技巧
规则写完别急着上线,先验证是否真起作用。
- 访问一个本该被重写的 URL(如
http://your-site/article/456.html),看是否正确加载article.php?id=456 - 如果返回 500 错误,大概率是正则写错或语法有误;返回 404 则可能是路径不对或
AllowOverride没生效 - 临时开启 Apache 重写日志(仅调试用):在主配置中添加
RewriteLog "/var/log/apache2/rewrite.log"<br>RewriteLogLevel 3
(注意新版 Apache 2.4+ 已弃用该方式,推荐用ErrorLog级别调高并查error_log)


















