Apache mod_rewrite 实现重定向需三步:启用模块(a2enmod rewrite)、授权目录重写(AllowOverride All)、编写带[R]标志的RewriteRule(如RewriteRule ^/old.html$ /new.html [R=301,L])。
在 Linux 系统中使用 RewriteRule 实现页面重定向跳转,关键在于 Apache 的 mod_rewrite 模块是否启用,并在正确的配置位置(如虚拟主机配置、.htaccess 文件)中编写符合语法的规则。重定向本身由 RewriteRule 配合 R 标志(如 R=301 或 R=302)完成。
Apache 默认可能未启用 mod_rewrite,或在目录级配置中禁止使用 RewriteRule:
a2enmod rewrite 启用模块(Debian/Ubuntu),然后重启 Apache:systemctl restart apache2
AllowOverride All(尤其在 <Directory> 块内),否则 .htaccess 中的规则不会生效/etc/apache2/sites-available/000-default.conf),可将规则写在 <VirtualHost> 内,无需依赖 .htaccess
RewriteRule 的标准格式为:
RewriteRule Pattern Substitution [Flags]
实现跳转需搭配 R 标志指定 HTTP 状态码:
RewriteRule ^/old-page.html$ /new-page.html [R=301,L] → 永久重定向(推荐用于已迁移的页面)RewriteRule ^/blog/(.*)$ https://blog.example.com/$1 [R=302,L] → 临时跳转到子域,保留路径RewriteRule ^/product.php?id=123$ /item/abc123 [R=301,L,QSD] → 跳转并丢弃原始查询参数(QSD 标志)注意:^ 和 $ 表示字符串起始与结束,避免部分匹配;. 转义点号;(.*) 捕获任意路径用于后续引用($1)。
实际使用中常遇到路径结构变化、域名切换或参数清理需求:
RewriteEngine On
RewriteRule ^(.*)$ https://new-site.com$1 [R=301,L]
RewriteCond %{THE_REQUEST} s/+(.+?).php[s?] [NC]RewriteRule ^ /%1 [R=301,L,NE]
RewriteRule ^(.+)$ $1.php [L,QSA]
RewriteCond %{HTTPS} off [OR]RewriteCond %{HTTP_HOST} !^www. [NC]
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=301,L,NE]
规则不生效?别急着改代码,先排查环境和逻辑:
RewriteLogLevel 3 和 RewriteLog "/var/log/apache2/rewrite.log"(Apache 2.4+ 改用 LogLevel alert rewrite:trace3)Ctrl+F5 强制刷新,避免 301 缓存干扰测试curl -I http://yoursite/old-path 查看返回的 Location: 头和状态码,确认是否真正跳转L 标志缺失导致后续规则继续执行)或冲突(如多个 RewriteCond 条件未满足)