我目前正在为我的网站实施一个 slug 系统。我计划将无效的 slug 重定向到存储在数据库中的正确的。例如
http://example.com/11/wrong-slug
点击 db,检查 11 的 slug 是否是错误的,如果没有做 301 重定向
http://example.com/11/right-slug
检测 301 并通知用户他们点击了无效链接
是否可以最好使用 PHP 识别 301 重定向,以便我可以要求用户更新那里的书签等。
谢谢,杰米。
我目前正在为我的网站实施一个 slug 系统。我计划将无效的 slug 重定向到存储在数据库中的正确的。例如
http://example.com/11/wrong-slug
点击 db,检查 11 的 slug 是否是错误的,如果没有做 301 重定向
http://example.com/11/right-slug
检测 301 并通知用户他们点击了无效链接
是否可以最好使用 PHP 识别 301 重定向,以便我可以要求用户更新那里的书签等。
谢谢,杰米。
或者,您可以将 GET 参数附加到您的 url(如果您不介意的话),并在您的 PHP 脚本中检查它。就像是:
http://example.com/11/right-slug?corrected-from=http://example.com/11/wrong-slug
同样,您可以使用会话或 cookie,但必须注意在检测后将其删除。
想到了几个解决方案:
您可以尝试使用get_headers() 啊不,它向 URL 发送请求,这不是您想要的
由于无论如何您都在重定向和测试来自同一台机器的重定向,您可以简单地在用户会话中写入一条关于错误 slug 的消息,并在下次呈现视图模板时显示它。许多框架都有一个flash messenger组件,可以让您轻松地做到这一点,例如,使用 Zend 框架,您可以在控制器操作中使用以下代码
$flashMessenger = $this->_helper->getHelper('FlashMessenger'); $flashMessenger->addMessage('我们在上一个请求中做了一些事情');
当发现错误的 slug 时,您无需立即重定向,而是渲染一个 View 模板,告诉用户错误的 slug,然后使用模板中的元或 javascript 重定向。或者,您还可以编写一个带有正确 slug 的普通链接到模板。
最后,您还可以通过header()将自定义标头注入重定向,然后可以从脚本中读取该标头。 也不起作用,因为一旦浏览器从服务器获得重定向,它们就会丢失
一个解决方案可能是检查$_SERVER['HTTP_REFERER']
“新”页面:如果它已设置并对应于“旧”页面,这可能是因为您的用户已被重定向——这意味着您可能想要显示您的消息。
但请注意,Referer是由用户的浏览器发送的,可以禁用或伪造——因此可以使用它来增强体验,但你不能依赖它来处理任何关键问题。
找到了一个可行的解决方案:
开始会话。
检查会话,如果 $_SESSION['INVALID_SLUG'] 存在显示消息然后取消设置会话
别的
从数据库中检索 slug,例如 /11/right-slug
获取当前 URI,例如 /11/wrong-slug
比较,如果不同的设置 $_SESSION['INVALID_SLUG'] 并重定向到正确的页面
任何反馈?我意识到这不会检测到 301 重定向本身,而是检测与重定向相关的触发器。
感谢所有的帮助。
我认为唯一有用的选择是使用 cookie。
当请求带有错误 slug 的 URL 时,为没有 slug 的 URL 设置一个 cookie:
$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.';
}