.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 都以你账户自己的用户身份运行。
- 你的带宽数字和访客统计。
- 服务器上的任何其他账户。这个设置只属于你——它是 按账户决定的,不是按服务器。