SEO 百科

mod_rewrite

本页目录

mod_rewrite

mod_rewrite 是一个 Apache 模块,按规则改写请求路径。它能把进来看到的网址换成内部真正处理的地址,或把一个网址重定向到另一个,规则由正则表达式驱动[1]。伪静态、协议补全、旧地址承接这些活多数由它完成。

两种工作方式

内部改写不改变浏览器地址栏,用户与爬虫看到的仍是原网址,服务器按新路径处理。外部重定向会给客户端一个新地址,带上 301 或 307 之类的状态码,客户端要再请求一次[1]。

对搜索而言这两者差别明显:改写只影响服务器内部路由;重定向会改变规范收敛的路径,永久搬家要用 301[2]。

常用的五条规则

按用途分:把 http 升到 https;把裸域与带 www 的两种形式统一到一个;把 /old-path 指到改版后的新地址;把 /x.html 内部改写给动态脚本处理;对不存在的路径返回正确的 404 而不是把一个空页当结果返回。

规则通常写在 .htaccess 或主配置里,作用域由放的位置决定[3]。

三条易错

顺序。重写按自上而下匹配,前面加了一条过宽的正则会把后面的规则全挡住。

循环。改写结果又满足原条件,请求被反复处理,表现为 500 或超时。

状态码。把该用 301 的搬家写成内部改写,或在临时跳转上用永久码,都会让旧地址的处置变成长期的[2]。

排查手法

打开重写日志看每条规则的匹配过程,是定位失效规则最快的路。测试时先看小范围:一次只放一条规则,用不同网址逐个验证,改完再合并[1]。

改版时配套的迁移清单要留全,旧地址的指向要能在抓取端核对,Google 的抓取报告与网址检查工具都可以看[4]。

常见误用

第一种是把所有跳转硬编码在应用层,规则散在几处,改版时漏掉一批。第二种是用重写掩盖 404,把不存在的页面返回成首页,这属于软 404 那一类问题[4]。第三种是规则里写死协议与主机,测试环境整站跳转到生产。

附录

参见

参考资料

官方(境外)

  1. 《Apache mod_rewrite documentation》,Apache HTTP Server Project。
  2. 《使用 301 重定向将网址迁移到 Google 搜索》,Google 搜索中心。
  3. 《Apache HTTP Server Tutorial: .htaccess files》,Apache HTTP Server Project。
  4. 《排查抓取问题》,Google 搜索中心。

外部链接