如何识别引用者是否为301重定向

时间:2009-12-26 13:06:51

标签: php apache mod-rewrite http-status-code-301

我正在为我的网站实施一个slu system系统。我计划将无效slug重定向到存储在数据库中的正确的slu。 E.g。

  

http://example.com/11/wrong-slug

     

点击数据库,检查11的slug是否错误 - 如果没有做301重定向

     

http://example.com/11/right-slug

     

检测301并通知用户他们关注了无效链接

是否可以使用PHP识别301重定向,以便我可以要求用户更新书签等。

谢谢, 杰米。

5 个答案:

答案 0 :(得分:5)

或者,您可以将GET参数附加到您的网址(如果您不介意),并在PHP脚本中检查它。类似的东西:

http://example.com/11/right-slug?corrected-from=http://example.com/11/wrong-slug

在同一个笔记中,您可以使用会话或cookie,但您必须在检测后将其删除。

答案 1 :(得分:2)

我想到了几种解决方案:

  1. 您可以尝试使用get_headers() 啊不,它会向URL发送请求,这不是您想要的

  2. 由于您正在重定向并测试来自同一台计算机的重定向,因此您只需将有关错误slug的消息写入用户会话,并在下次呈现视图模板时显示该消息。许多框架都有一个 flash messenger 组件,可以让您轻松完成,例如使用Zend Framework,您可以在控制器操作中使用以下代码

    $ flashMessenger = $ this-> _helper-> getHelper('FlashMessenger'); $ flashMessenger-> addMessage('我们在最后一次请求中做了一些事情');

  3. 不是在找到错误的slug时立即重定向,而是渲染一个View模板,告诉用户错误的slug,然后使用模板中的meta或javascript重定向。或者,您还可以使用正确的slug将纯链接写入模板。

  4. 最后,您还可以通过header()将自定义标头注入重定向,然后可以从您的脚本中读取。 也无效,因为一旦浏览器从服务器获得重定向,它们就会丢失

答案 2 :(得分:1)

解决方案可能是检查“新”页面中的$_SERVER['HTTP_REFERER']:如果已设置并且对应于“旧”页面,则可能是因为您的用户已被重定向 - 这意味着您可能需要显示你的信息。

但请注意,Referer是由用户的浏览器发送的,可以被禁用或伪造 - 因此可以使用它来增强体验,但是你不能依赖它来做任何关键的事情。

答案 3 :(得分:0)

找到了一个有效的解决方案:

  • 开始会话。
  • 检查会话,如果$ _SESSION ['INVALID_SLUG']存在,则显示消息,然后取消设置会话

    否则

  • 来自数据库的Retreive slug,例如/ 11 / right-slug
  • 获取当前的URI,例如/ 11 /错蛞蝓
  • 比较,如果不同设置$ _SESSION ['INVALID_SLUG']并重定向到正确的页面

有任何反馈意见吗? 我意识到这不会检测到301重定向本身更多地检测到与重定向相关的触发器。

感谢您的帮助。

答案 4 :(得分:0)

我认为唯一有用的选择是使用cookie。

当请求具有错误slug的URL时,为该URL设置一个cookie而不使用slug:

$path = substr($_SERVER['REQUEST_URI'], 0, strrpos($_SERVER['REQUEST_URI'], '/')+1);
setcookie('wrong-slug', 1, 0, $path);

然后测试是否存在这样的cookie并显示您的消息:

if (isset($_COOKIE['wrong-slug'])) {
    echo 'The location of this resource has changed. Please update your bookmarks.';
}