文档 / .htaccess——两种模式,以及你想要哪一种

.htaccess——两种模式,以及你想要哪一种

如果你往 .htaccess 里加了点什么,而站点表现得就像你没加过一样, 请先读这一篇。什么都没坏——你的站点很可能处于那种 翻译 .htaccess 而不是读取它的模式,而翻译覆盖的是常见 规则,并非全部。

打开 域名 → Apache / .htaccess。卡片顶部的徽章会说明 这个站点处于哪种模式。

两种模式

已翻译(Translated)(默认)。你的 .htaccess 被转换成那台快速 Web 服务器自己的规则。常见指令能工作。转换器无法 复现的任何东西都会被跳过,并在卡片下方的表格里为你列出。对文件的 更改只有在你按下 Translate now 之后才会生效——文件 不会在每次请求时被读取。

完整 .htaccess(Full .htaccess)。你的文件被直接读取,与它在 cPanel 上 时一模一样。Apache 支持的每一条指令都能工作,更改会在紧接着的 下一次请求上生效。比翻译模式略慢,因为每次请求都会多经过 一个额外的步骤。

你想要哪一种

如果你的 .htaccess 是一个 WordPress 固定链接块、一个强制 HTTPS 重定向、一个 www/非-www 重定向、一行 Redirect、一个目录 列表开关,或基本认证保护,就留在 已翻译(Translated)。那是大多数站点, 也是更快的路径。

在以下情况开启 完整 .htaccess(Full .htaccess):

  • 卡片下方的表格列出了你确实需要的指令,
  • 你从 .htaccess 设置 PHP 值(php_value、php_flag)——这些在翻译模式下 永远不会被应用,无论文件里写了什么,
  • 你使用 SetEnv、SetEnvIf、RequestHeader、AddType、AddHandler,或 带有转换器警告过的条件的重写规则,
  • 或者你正把一个站点从别处迁进来,而宁愿根本不去审查它的 .htaccess。

选择完整支持除了少量延迟外没有任何代价。没有 收费,之后没有额外步骤,也没有配置。

读懂那张表

在模式卡片下方,每一行都是转换器无法 复现的一条指令,附带它的行号以及该如何处理。

  • 在 已翻译(Translated) 模式下,按钮上方的说明会讲当中有多少条正在被 此刻 忽略。那些规则没有在运行。
  • 在 完整 .htaccess(Full .htaccess) 模式下,同样的列表会出现,但说明会讲它们 正在工作——这个列表只有在你哪天切回去时才有意义。

如果表格是空的,那么你的 .htaccess 里没有任何东西正在丢失,翻译 模式正在完成文件要求的一切。

切换

一个按钮。在翻译模式下它显示 Turn on full .htaccess support;在 完整模式下它显示 Switch to translated (faster)。

  • 它需要几秒钟。工作时卡片会显示 Applying — this can take a few seconds…。
  • 你的站点不会宕机。 新路径会在旧路径被撤下之前就位, 两个方向都是如此,而且如果任何环节失败,两侧都会 被恢复原状。
  • 账户的其他任何东西都不会改变。 你的文件、你的文档根目录、 你的 PHP 版本、你的证书和你的 HTTPS 全都保持 原样。在两种模式下,你站点的 PHP 都仍以你自己的用户身份运行,与服务器上的其他每一个 账户隔离。
  • 你访问日志中的访客地址仍是真实的访客地址。
  • 你可以随时切回去,想切多频繁都行。

从 cPanel 迁来

你什么都不必做。当一个账户从一份 cPanel 备份导入时,导入器会翻译它找到的 .htaccess 文件,并且 如果任何 指令无法被翻译,该账户会立即被置入完整 .htaccess 模式。 从第一个请求起,站点的表现就与它在旧服务器上时一样。

导入报告会以两行显示这一点:多少条规则被翻译,以及 多少条需要审查,然后是模式是否被切换。

从不需要任何异常之处的站点,会留在更快的翻译路径上。

当有什么看起来不对时

你编辑了文件之后一条规则仍然什么都没做,而你处在翻译 模式。 按 Translate now。在这种模式下,文件是在你要求时被读取,而不是 在每次请求时。

你刚开启完整支持后每个页面都返回 HTTP 500。 切 回去——按钮会把你放回原来的位置——并告诉你的主机服务商发生了 什么。这意味着那台服务器上的 Apache 缺少你的文件需要的一个模块 (RewriteEngine On 是常见的那个)。这是一个服务器端的设置,不是 你能从自己的账户里修的东西。

每个页面都返回 502 而你处在完整模式。 服务器上的 Apache 进程 没有在运行。处于翻译模式的站点不受影响,这是一个 值得告诉你服务商的有用信息。

切换被拒绝,并带有一条关于 Apache 端口的消息。 服务器已经用完了 它为这种模式分配的槽位。只有你的服务商能提高它。

Apache / .htaccess 图块根本不在你的面板里。 要么你的主机 套餐不包含它,要么服务器在设置时没有配备 Apache。 问你的服务商是哪一种。

完整模式不会改变什么

  • 你的证书。HTTPS 在 Apache 看到请求之前就已终止,因此 签发和续期不受影响。
  • 隔离。在两种模式下 PHP 都以你账户自己的用户身份运行。
  • 你的带宽数字和访客统计。
  • 服务器上的任何其他账户。这个设置只属于你——它是 按账户决定的,不是按服务器。