通知用户301重定向


Informing the user about a 301 redirect

考虑以下方案:

site A ------> site B (old URL)  --- 301 redirect ---> site C (new URL)

下面是发生的事情

用户访问站点A。站点A包含指向站点B(旧URL)的链接。当用户单击指向站点B的链接时,他将被重定向到站点C(新URL)。站点B发布重定向到站点C。

问题

当用户最终到达站点C时,我想通知他重定向的情况。

我尝试过的

  • 当我在站点C中处理传入请求时,我尝试过寻找HTTP_REFERER标头,但引用者URL似乎指向站点A。我本以为它指向站点B。我是否遗漏了与301重定向和此特定标头的实现有关的内容?我知道它是由浏览器设置的,可能会出现意外行为,但为什么不能指望它会引用网站B(发布重定向的网站)
  • 在发出重定向时,在新URL的末尾附加一个?redirected=1查询字符串听起来像是一个解决方案,但它需要a)确保规范的URL到位,以避免重复的内容,b)混淆新URL,我希望在地址栏中尽可能保持干净

在Javascript或元刷新重定向发挥作用之前,总是可以选择显示具有预定义超时的中间重定向页面,但我想避免这种方法,而是在新网站中显示消息,以避免混淆用户和网络爬虫,因为我读到浏览器内重定向不如服务器端重定向可靠。

解决这个问题的一般方法是什么?

更新:从站点B重定向到example.com/redirect.php?referrer_url=oldurl&redirect_to=newurl怎么样?

然后,redirect.php将检测oldurl作为引用方URL,将重定向消息闪存到会话,并向example.com/newurl发出301重定向。从SEO的角度来看,这是个好主意吗?

您可以通过重定向发送自己的http头,例如:

header('RedirectedFrom: www.something.com/ifoo/bar.html');

并在目标站点使用它来识别重定向

$headers = headers_list();
foreach($headers as $header) {
    list($name,$value) = explode(':',$header);
    if($value == 'RedirectedFrom') {
        // what ever you want to do
        break;
    }
}

我提出了以下问题的解决方案。

站点B(旧URL)被重定向到站点C的特定脚本,该脚本的工作是处理传入请求并在必要时执行重定向。

例如,如果用户浏览站点a并单击指向站点B的链接,则会重定向到站点C的redirect.php脚本,该脚本接受两个GET参数:referrer_urldestinationreferrer_url是到站点B的旧链路,destination是站点C的相对路径。

然后,脚本确保destination不是一个绝对的URL(以避免大量重定向到其他站点),将其附加到站点C的基本URL,并将用户重定向到适当的页面。referrer_url不是必需的,但它可以用于检测旧站点B URL的域(在存在多个不同域的情况下)。