考虑以下方案:
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_url
和destination
。referrer_url
是到站点B的旧链路,destination
是站点C的相对路径。
然后,脚本确保destination
不是一个绝对的URL(以避免大量重定向到其他站点),将其附加到站点C的基本URL,并将用户重定向到适当的页面。referrer_url
不是必需的,但它可以用于检测旧站点B URL的域(在存在多个不同域的情况下)。