文档首页> 技术教程> .htaccess 常用规则:伪静态与强制跳转

.htaccess 常用规则:伪静态与强制跳转

发布时间:2026-10-02 20:47        更新时间:2026-10-03 20:06
伪静态、强制 https、旧链接跳新地址,Apache 用户的这三件事十有八九写在 .htaccess 里。规则依赖 mod_rewrite 模块,写起来短,死循环和拼接错误却常见,这篇给三条高频规则和排错思路。 一、前置条件 ``` sudo a2enmod rewrite sudo systemctl reload apache2 ``` 同时确认站点配置允许目录覆盖——在 VirtualHost 或对应的目录段里写上 AllowOverride All:AllowOverride None 会让 .htaccess 整个失效。规则写了没反应,先查这一处。 二、三条常用规则 所有规则都从开引擎起步:RewriteEngine On。 规则一,强制 https: ``` RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] ``` 规则二,伪静态,把 /article.php?id=88 变成 /article-88.html: ``` RewriteRule ^article-([0-9]+)\.html$ article.php?id=$1 [L] ``` 方括号里的 L 表示命中即停止后续匹配。$1 引用括号捕获的内容。伪静态只改 URL 的呈现形式,后端收到的参数不变,程序与数据库都不用动,这是它和真静态页面的本质区别。正则里的点必须转义成 \. ,不转义时它能匹配任意字符,article-88Xhtml 这类乱拼地址也会被误命中。 规则三,整站 301 到新域名: ``` RewriteCond %{HTTP_HOST} ^old\.example\.com$ [NC] RewriteRule ^(.*)$ https://new.example.com/$1 [R=301,L] ``` [NC] 表示域名大小写不敏感。RewriteCond 可以叠加,多条条件之间默认是 AND 关系,加 [OR] 才是或——条件关系写反导致规则从不触发,也是高频错误之一。 三、死循环的常见原因 浏览器报 ERR_TOO_MANY_REDIRECTS 就是成环了,三个高频病灶: - 套了 CDN 时强制 https 规则误判:到源站的请求 HTTPS 变量可能是 off,源站再跳 https,CDN 又打回来。判断条件改用 %{HTTP:X-Forwarded-Proto} !~ ^https$ 更稳。 - 两条跳转规则互相推:https 规则和域名归一规则各写一遍,组合成环。把多个条件合并进同一条规则的 RewriteCond 里。 - 规则的目标路径又匹配了它自己:补一条 RewriteCond 排除目标路径。 四、调试办法 Apache 2.4 可以打开重写追踪,把日志级别设为 LogLevel alert rewrite:trace3,tail -f error.log 就能看到每一步的匹配与替换细节,比盲改快得多。追踪日志很占磁盘,确认无误后记得改回去。.htaccess 改动即时生效、不用 reload,方便迭代;代价是每个请求都要读一遍文件,流量大的站点应把规则上移到主配置,只在必须分布式配置的场景留它。