Php 如何确定推荐人是否为301重定向
我现在正在为我的网站实现一个slug系统。我计划将无效的slug重定向到存储在数据库中的正确位置。 例如 点击db,检查11的slug是否错误slug如果不是301重定向 检测301并通知用户他们跟踪了无效链接 是否可以最好使用PHP来识别301重定向,这样我就可以要求用户更新那里的书签等 谢谢,Php 如何确定推荐人是否为301重定向,php,apache,mod-rewrite,http-status-code-301,Php,Apache,Mod Rewrite,Http Status Code 301,我现在正在为我的网站实现一个slug系统。我计划将无效的slug重定向到存储在数据库中的正确位置。 例如 点击db,检查11的slug是否错误slug如果不是301重定向 检测301并通知用户他们跟踪了无效链接 是否可以最好使用PHP来识别301重定向,这样我就可以要求用户更新那里的书签等 谢谢, 杰米。我想到了几种解决方案: 您可以尝试使用ah no,它向URL发送请求,这不是您想要的 由于您正在重定向并测试来自同一台机器的重定向,因此只需将有关错误slug的消息写入用户会话,并在下次呈现
杰米。我想到了几种解决方案:
解决方案可能是在“新建”页面中检查
$\u服务器['HTTP\u REFERER']
:如果设置了该服务器并与“旧”页面相对应,则可能是因为您的用户已被重定向,这意味着您可能希望显示您的消息
但是请注意,该参数是由用户的浏览器发送的,可以被禁用或伪造——因此可以使用它来增强体验,但在任何关键的事情上都不能依赖它。或者,您可以在url中附加一个GET参数(如果您不介意的话),并在PHP脚本中检查它。比如:
http://example.com/11/right-slug?corrected-from=http://example.com/11/wrong-slug
同样,您可以使用会话或Cookie,但必须注意在检测后删除它们。找到了一个有效的解决方案:
- 开始会话
- 检查会话,如果存在$\u会话['INVALID\u SLUG']显示消息,则取消设置会话 否则
- 从数据库检索段塞,例如/11/右段塞
- 获取当前URI,例如/11/错误的slug
- 比较,如果不同设置$\u会话['INVALID\u SLUG'],并重定向到正确的页面
谢谢你的帮助。我认为唯一有用的选择是使用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.';
}
因此,我可以使用get_headers(url)返回当前页面的状态。然而,我不知道如何使用它来检测它们是否已经被重定向。我想我可以在重定向的url中添加一个标志。但同样,这会导致更多的问题。我错了,get_headers()不是您要查找的,但请检查更新的答案以寻找其他可能的解决方案。刚刚尝试了此方法,在访问重定向页面时返回了一个空白的引用器。哦,太糟糕了--我在这里做了一个快速测试,它似乎正在工作:-(我做了:header)(“HTTP/1.1 301永久移动”);标头(“位置:);然后是javascript:alert(document.referer);您是如何做到的?我在.htaccess文件中使用了重写规则——但由于您使用一些PHP进行重定向,您最好使用另一种解决方案,而不是依赖于referer(例如,使用基于会话变量的内容)当然,您会希望对该参数进行URL编码,但这似乎比依赖特定浏览器可能选择发送的内容更简单。通过添加额外的参数,URL将再次改变,从而使其自身循环。如果(无效){session();redirect}可能是我了解会话的时间,我可以使用会话!我不确定您是如何选择重定向的,但通常您只查看URI的部分,直到但不包括查询字符串。因此,您的301目标位置是/11/right slug?更正自=…而不仅仅是/11/right slug?我不认为这是一个选择。因为我使用的是slug系统,在/11/之后的任何东西都被算作slug。如果不强制使用尾随斜杠并更改我的mod_rewrite,我就无法使用任何url参数,因为用户可能会将更正后的url作为书签。请记住,会话可能无法工作(用户关闭/阻止了Cookie),获取参数解决方案更可靠。如果你的页面依赖会话来工作,这没什么大不了的。检测301重定向是不可能的,因为重定向只不过是告诉浏览器对不同的URL执行相同的请求。如果您不自己添加第二个请求(查询参数、会话、cookie等),则第二个请求将不包含任何有关以前请求的信息。这就是我在回答中建议的解决方案#2。您为什么选择Gordon的答案?请访问以下网址查看我建议的解决方案: