linux下apache启用rewrite模块需三步:加载mod_rewrite模块、配置allowoverride all授权.htaccess、在.htaccess中启用rewriteengine on并正确书写规则,缺一不可。
linux 下 apache 启用 rewrite 模块不是“开个开关”就完事,必须三步齐备:模块加载成功、目录权限放行、规则启用明确。缺一不可,否则 .htaccess 里的 rewriterule 完全不生效。
确认并启用 mod_rewrite 模块
先验证模块是否已加载运行,不能只看配置文件有没有那行:
- Debian/Ubuntu 系统执行:sudo a2enmod rewrite && sudo systemctl restart apache2
- RHEL/CentOS 系统检查:httpd -M | grep rewrite,若无输出,编辑 /etc/httpd/conf/httpd.conf,取消注释:LoadModule rewrite_module modules/mod_rewrite.so,再执行 sudo systemctl restart httpd
- 验证生效:访问一个 PHP 页面,用 phpinfo() 查看是否有 mod_rewrite;或直接请求任意路径加个不存在的参数(如 /?test),配合 curl -I 观察响应头是否可被后续规则干预
放开 .htaccess 的重写权限
即使模块开着,Apache 默认禁止 .htaccess 调用重写功能。必须在站点对应目录配置中显式授权:
- 找到你的网站根目录配置段,例如:
- 把其中的 AllowOverride None 改为 AllowOverride All
- (可选但推荐)同时确保 Options FollowSymLinks 已启用,否则部分规则可能报 500 错误
- 修改后必须重启 Apache:sudo systemctl restart apache2 或 sudo systemctl restart httpd
在 .htaccess 中启用并编写规则
权限放开后,.htaccess 才真正可用。注意格式和顺序:
- 文件必须放在网站根目录(如 /var/www/html/.htaccess),且以 UTF-8 无 BOM 编码保存
- 开头必须有:RewriteEngine On —— 这条不写,后面所有规则全部静默失效
- 匹配路径时,RewriteRule 的模式不带开头斜杠(例如写 ^old\.html$,不是 ^/old\.html$)
- 301 重定向需显式加 [R=301,L],比如强制 HTTPS 可写:
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
快速验证是否生效
别靠浏览器刷新猜,用命令行直击响应头:
- 在 .htaccess 加一条测试规则:RewriteRule ^test-redirect$ /index.html [R=301,L]
- 执行:curl -I http://yoursite.com/test-redirect
- 看到 HTTP/1.1 301 Moved Permanently 和 Location: .../index.html,说明整套链路通了
- 如果返回 404 或无重定向头,重点复查 AllowOverride 设置和 RewriteEngine 是否开启











