我正在关闭一个站点,并在站点的根级别用一个“无人主页”页面替换了旧站点。现在我需要设置一些重定向,以便对站点任何部分的任何请求,无论多么复杂,都以根页面结束。
我已经尝试过(我认为)应该起作用的方法:创建一个.htaccess
包含:
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://www.example.com/ [L,R=301,NE]
但它大多失败:请求http://www.example.com
仍然通过,但https://www.example.com/doesnotexist.html
抛出 404。(如果没有重定向,这是正确的,因为该页面在网站上不存在,但这就是重定向的重点:我希望将此请求发送到https://www.example.com
。)
啊。除了我之外,这个问题的答案可能对所有人来说都是显而易见的;任何人都可以帮忙吗?
PS:我处于共享托管情况,所以我必须使用.htaccess
文件而不是破解完整的 Apache 配置文件。
如果您正在“关闭站点”,那么您可能不应该将旧站点页面“重定向”到单个页面。HTTP 重定向发送 301 响应代码,通知用户和搜索引擎页面已移动。(尽管对单个页面的大规模重定向很可能被 Google 视为软 404。)
相反,您应该提供自定义的“410 Gone”响应。410 通知搜索引擎页面已消失且不再返回。您的“单页”是自定义错误文档。
例如:
检查环境变量的附加条件(在初始请求时为空,但在触发并设置 HTTP 响应状态
REDIRECT_STATUS
后设置为“410” )是为了确保两件事:RewriteRule
错误文档本身的内部子请求(即
/single-page.html
在此示例中)不会触发另一个 410(本质上导致无限循环),从而阻止提供自定义错误文档(在这种情况下将发送默认服务器响应)。并且还允许对其自身的直接请求
/single-page.html
也触发 410 而无需创建重写循环。(旁白:不幸的是,使用这种方式检测已触发的“错误状态”的技术似乎不适用于 LiteSpeed 服务器,因为在 4xx 响应的情况下,在请求期间未更新 env var 。但是,它已更新对于内部重写,即 200 个 OK 响应,因此它仍然是防止一般内部重写循环的好解决方案。奇怪的是为什么会有这种差异。似乎是一个错误。)
REDIRECT_STATUS
如果您有需要在错误文档中显示的图像(和/或其他外部资源),请参阅我对以下相关问题的回答:
原因
http://www.example.com/
是有效的,https://www.example.com/doesnotexist.html
而不是因为如果客户端通过 HTTPS 访问站点,您的重写条件会显式禁用重写(我相信现在有几个主要浏览器默认这样做,但我没有这方面的来源我的头顶)。我假设您这样做是为了防止无限循环,否则它将无限地重写并将每个请求重定向到(我假设是)规范 url,而客户端永远无法实际查看页面。
我相信以下配置是您正在寻找的。请注意,我在本地服务器上对此进行了测试,但我运行的是 2.4.46 版。就我所知,从对2.2 版 mod_rewrite 文档的半看半看中可以看出,升级到2.4 版没有任何重大变化,至少在
mod_rewrite
具体情况下是这样。显然,此配置启用了重写引擎,之后它会检查请求的 URI。如果它不等于“/”,它会将整个内容重写为仅文档根目录,
301
像您在原始文件中所做的那样发出重定向,并停止处理任何进一步的规则。您可能需要也可能不需要RewriteBase "/"
在RewriteEngine On
. 当我测试这个时似乎并不重要,因为我能够毫无问题地重写嵌套目录 URI(即../a/b/c
成功重定向到/
),但文档确实指出了这一点,所以我在这里将警告传递下去。同样,我确实对此进行了测试,但是服务器版本不同,因此希望您不会遇到任何问题。请注意,为了使其正常工作(除非技术限制或由上述版本差异引起的差异),您的托管服务提供商需要启用该
AllowOverride
指令,可能带有All
选项,尽管我无法确定究竟是什么重写指令工作的最低要求是。这不应该工作吗?