2

我目前正在为我的网站实施一个 slug 系统。我计划将无效的 slug 重定向到存储在数据库中的正确的。例如

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

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

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

检测 301 并通知用户他们点击了无效链接

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

谢谢,杰米。

4

5 回答 5

5

或者,您可以将 GET 参数附加到您的 url(如果您不介意的话),并在您的 PHP 脚本中检查它。就像是:

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

同样,您可以使用会话或 cookie,但必须注意在检测后将其删除。

于 2009-12-26T13:22:27.437 回答
2

想到了几个解决方案:

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

  2. 由于无论如何您都在重定向和测试来自同一台机器的重定向,您可以简单地在用户会话中写入一条关于错误 slug 的消息,并在下次呈现视图模板时显示它。许多框架都有一个flash messenger组件,可以让您轻松地做到这一点,例如,使用 Zend 框架,您可以在控制器操作中使用以下代码

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

  3. 当发现错误的 slug 时,您无需立即重定向,而是渲染一个 View 模板,告诉用户错误的 slug,然后使用模板中的元或 javascript 重定向。或者,您还可以编写一个带有正确 slug 的普通链接到模板。

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

于 2009-12-26T13:11:41.250 回答
1

一个解决方案可能是检查$_SERVER['HTTP_REFERER']“新”页面:如果它已设置并对应于“旧”页面,这可能是因为您的用户已被重定向——这意味着您可能想要显示您的消息。

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

于 2009-12-26T13:15:16.447 回答
0

找到了一个可行的解决方案:

  • 开始会话。

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

    别的

  • 从数据库中检索 slug,例如 /11/right-slug

  • 获取当前 URI,例如 /11/wrong-slug

  • 比较,如果不同的设置 $_SESSION['INVALID_SLUG'] 并重定向到正确的页面

任何反馈?我意识到这不会检测到 301 重定向本身,而是检测与重定向相关的触发器。

感谢所有的帮助。

于 2009-12-26T14:19:04.903 回答
0

我认为唯一有用的选择是使用 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.';
}
于 2009-12-26T14:28:17.413 回答