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的消息写入用户会话,并在下次呈现

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

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

检测301并通知用户他们跟踪了无效链接

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

谢谢,
杰米。

我想到了几种解决方案:

  • 您可以尝试使用ah no,它向URL发送请求,这不是您想要的

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

    $flashMessenger=$this->\u helper->getHelper('flashMessenger'); $flashMessenger->addMessage(“我们在上次请求中做了一些事情”)

  • 当发现错误的slug时,不需要立即重定向,只需呈现一个视图模板,告诉用户错误的slug,然后使用来自该模板的meta或javascript重定向。或者,您还可以将带有正确slug的普通链接写入模板

  • 最后,您还可以将自定义头插入重定向via,然后从脚本中读取重定向via。也不会工作,因为一旦浏览器从服务器获得重定向,它们就会丢失


  • 解决方案可能是在“新建”页面中检查
    $\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'],并重定向到正确的页面

    有什么反馈吗? 我意识到这不会检测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.';
    }
    

    因此,我可以使用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的答案?请访问以下网址查看我建议的解决方案: