如何将整个网站重定向到单个页面?

Jim*_*ler 12 mod-rewrite .htaccess redirection apache-2.2

我正在关闭一个站点,并在站点的根级别用一个“无人主页”页面替换了旧站点。现在我需要设置一些重定向,以便对站点任何部分的任何请求,无论多么复杂,都以根页面结束。

我已经尝试了(我认为)应该工作的内容:创建一个.htaccess包含以下内容的文件:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://www.example.com/ [L,R=301,NE]
Run Code Online (Sandbox Code Playgroud)

但它大多失败:请求http://www.example.com仍然通过,但https://www.example.com/doesnotexist.html抛出 404。(如果没有重定向,这是正确的,因为该页面不存在于站点上,但这就是重定向的重点:我希望将此请求发送到https://www.example.com。)

阿格。这个问题的答案可能对除了我之外的每个人都是显而易见的。任何人都可以帮忙吗?

PS:我处于共享主机的情况,所以我必须用一个.htaccess文件来做到这一点,而不是破解一个完整的 Apache 配置文件。

MrW*_*ite 42

如果您要“关闭站点”,那么您可能不应该将旧站点页面“重定向”到单个页面。HTTP 重定向发送 301 响应代码,通知用户和搜索引擎页面已移动。(尽管大量重定向到单个页面可能会被 Google 视为软 404。)

相反,您应该提供自定义的“410 Gone”响应。410 通知搜索引擎页面已经消失并且不会回来。您的“单页”是自定义错误文档。

例如:

ErrorDocument 410 /single-page.html

RewriteEngine On

# Trigger a 410 Gone for all user requests
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^ - [G]
Run Code Online (Sandbox Code Playgroud)

检查REDIRECT_STATUS环境变量的附加条件是确保对/single-page.html自身的直接请求也触发 410,而不会创建重写循环。所述REDIRECT_STATUS的环境变量是空的初始请求,但设定为“410”的后RewriteRule触发和HTTP响应状态被设置。

旁白:使用的技术REDIRECT_STATUS用这种方式来检测已经引发“错误状态”,因为没有更新的环境变量上的Litespeed服务器不工作,在4xx响应的情况下请求。然而,它是为内部重写更新,即 200 OK 响应,因此它仍然是防止内部重写循环的一个很好的解决方案。但奇怪的是为什么会有这种差异。似乎是一个错误。)