只有在重定向行

时间:2016-10-18 16:04:25

标签: javascript redirect greasemonkey

我的网站正在运行,未登录时会重定向到错误的登录页面。

<html>
  <head>
    <meta name="robots" content="noindex,nofollow">
    <script type="application/javascript">
      window.location.href = '/access/login?return_to=' + encodeURIComponent(window.location.href);
    </script>
  </head>
</html>

实际页面加载了200 OK且没有Location:标题。

为了解决这个问题,我编写了一个Greasemonkey脚本,在pageload之前运行:

// ==UserScript==
// @name        Fix buggy login redirect
// @namespace  apburk@example.com
// @description Fixes the buggy redirect that redirects to the wrong login page
// @include    https://internal.domain/*
// @version    1
// @grant      none
// @run-at document-start
// ==/UserScript==
window.addEventListener('beforescriptexecute', function(e) {
if (document.getElementsByTagName("script")[0].text.trim() === "window.location.href = '/access/login?return_to=' + encodeURIComponent(window.location.href);") {

window.location.replace('https://example.com');
alert(" ");
}

}, true);

我的脚本检查是否存在重定向到错误页面的JavaScript,然后将我发送到正确的登录URL。

如果alert()存在,此脚本可以正常工作。删除alert(),页面重定向到损坏的登录页面。但是,当alert() 时,我从未看到警告框,但执行会被重定向到正确的页面。

我可以离开alert(),因为它似乎无法运行,但我想删除它并仍然将页面重定向到我想要的页面。

我对此问题的疑问:

  • 为什么会这样?是否涉及计时问题?
  • 如果没有无用的alert()电话,我怎样才能正常工作?

1 个答案:

答案 0 :(得分:2)

该代码有一些&#34;竞争条件&#34;。如果缺少alert(),旧的JS仍会在location.replace();完成之前触发 警报需要时间来解雇。有了它,location.replace就可以完成。

正确的做法是停止脚本然后触发替换。使用stopPropagationpreventDefault执行此操作。像这样:

window.addEventListener ('beforescriptexecute', function (e) {
    if (document.getElementsByTagName ("script")[0].text.trim()
        === "window.location.href = '/access/login?return_to=' + encodeURIComponent(window.location.href);"
    ) {
        e.stopPropagation ();
        e.preventDefault ();
        window.location.replace ('https://example.com');
    }
}, true);