一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Linux 中如何使用 RewriteRule 实现页面重定向跳转

时间:2026-09-04 18:28:47 编辑:袖梨 来源:一聚教程网

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=301R=302)完成。

确认 mod_rewrite 已启用并允许重写

Apache 默认可能未启用 mod_rewrite,或在目录级配置中禁止使用 RewriteRule

  1. 运行 a2enmod rewrite 启用模块(Debian/Ubuntu),然后重启 Apache:systemctl restart apache2
  2. 检查站点配置中对应目录是否设置了 AllowOverride All(尤其在 <Directory> 块内),否则 .htaccess 中的规则不会生效
  3. 若直接编辑虚拟主机配置(如 /etc/apache2/sites-available/000-default.conf),可将规则写在 <VirtualHost> 内,无需依赖 .htaccess

基本 RewriteRule 重定向语法

RewriteRule 的标准格式为:

RewriteRule Pattern Substitution [Flags]

实现跳转需搭配 R 标志指定 HTTP 状态码:

  1. RewriteRule ^/old-page.html$ /new-page.html [R=301,L] → 永久重定向(推荐用于已迁移的页面)
  2. RewriteRule ^/blog/(.*)$ https://blog.example.com/$1 [R=302,L] → 临时跳转到子域,保留路径
  3. RewriteRule ^/product.php?id=123$ /item/abc123 [R=301,L,QSD] → 跳转并丢弃原始查询参数(QSD 标志)

注意:^$ 表示字符串起始与结束,避免部分匹配;. 转义点号;(.*) 捕获任意路径用于后续引用($1)。

常见场景与写法示例

实际使用中常遇到路径结构变化、域名切换或参数清理需求:

  1. 整站换域名:在旧站配置中添加

    RewriteEngine On

    RewriteRule ^(.*)$ https://new-site.com$1 [R=301,L]

  2. 移除 .php 后缀并跳转

    RewriteCond %{THE_REQUEST} s/+(.+?).php[s?] [NC]

    RewriteRule ^ /%1 [R=301,L,NE]

    RewriteRule ^(.+)$ $1.php [L,QSA]

  3. 强制 HTTPS + www(常放在主配置开头):

    RewriteCond %{HTTPS} off [OR]

    RewriteCond %{HTTP_HOST} !^www. [NC]

    RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=301,L,NE]

调试与验证技巧

规则不生效?别急着改代码,先排查环境和逻辑:

  1. 开启重写日志(仅开发环境):RewriteLogLevel 3RewriteLog "/var/log/apache2/rewrite.log"(Apache 2.4+ 改用 LogLevel alert rewrite:trace3
  2. 浏览器访问时按 Ctrl+F5 强制刷新,避免 301 缓存干扰测试
  3. curl -I http://yoursite/old-path 查看返回的 Location: 头和状态码,确认是否真正跳转
  4. 确保没有其他规则提前终止(L 标志缺失导致后续规则继续执行)或冲突(如多个 RewriteCond 条件未满足)

热门栏目