How to identify if referrer is a 301 redirect

前提是你 提交于 2019-12-02 04:22:48

Several solutions come to mind:

  1. You could try with get_headers() ah no, it dispatches a request to the URL, which is not what you want

  2. Since you are redirecting and testing for the redirect from the same machine anyway, you could simply write a message about the wrong slug into the user's session and display it the next time the view template is rendered. Many frameworks have a flash messenger component, that allow you do that easily, e.g. with Zend Framework you would use the following code in your controller action

    $flashMessenger = $this->_helper->getHelper('FlashMessenger'); $flashMessenger->addMessage('We did something in the last request');

  3. Instead of redirecting immediately when a wrong slug is found, you just render a View template that tells your user about the wrong slug and then use a meta or javascript redirect from the template. Optionally, you'd also write a plain link with the right slug to the template.

  4. And finally, you could also inject a custom header into the redirect via header(), which can then be read from your script. won't work either, because they will be lost once the browser got the redirect from the server

Alternatively you could append a GET parameter to your url (if you don't mind that), and check for it in your PHP script. Something like:

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

On the same note you can use the session or cookies, but you must take care to remove them after detection.

A solution might be to check the $_SERVER['HTTP_REFERER'] in the "new" page : if it is set and corresponds to the "old" page, it's probably because your user has been redirected -- which means you might want to display your message.

But note that the Referer is sent by the user's browser, and can be either disabled or forged -- so it's OK to use it to enhance the experience, but you must not rely on it for anything critical.

Found a working solution:

  • Start session.
  • Check session, if $_SESSION['INVALID_SLUG'] exists display message then unset session

    else

  • Retreive slug from database e.g. /11/right-slug
  • Get current URI e.g. /11/wrong-slug
  • Compare, if different set $_SESSION['INVALID_SLUG'] and redirect to correct page

Any feedback? I realise this will not detect a 301 redirect itself more detect a trigger assosiated with the redirect.

Thanks for all the help.

I think the only useful option is to use a cookie.

When a URL with the wrong slug is requested, set a cookie for that URL without the slug:

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

Then test if such a cookie exists and display your message:

if (isset($_COOKIE['wrong-slug'])) {
    echo 'The location of this resource has changed. Please update your bookmarks.';
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!