我的网站正在运行,未登录时会重定向到错误的登录页面。
<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()
电话,我怎样才能正常工作?答案 0 :(得分:2)
该代码有一些&#34;竞争条件&#34;。如果缺少alert()
,旧的JS仍会在location.replace();
完成之前触发
警报需要时间来解雇。有了它,location.replace
就可以完成。
正确的做法是停止脚本然后触发替换。使用stopPropagation
和preventDefault
执行此操作。像这样:
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);