我正在尝试使用子过滤器在 .js 文件中替换此代码的片段。
SYNO.SDS.AzureSSOUtils = function() {
var a = 600
, c = 500
, e = (screen.width / 2) - c / 2
, d = (screen.height / 2) - a / 2
, b = String.format("height={0},width={1},left={2},top={3}", a, c, e, d);
return {
login: function(l, i) {
var f = (function(m) {
l(i, m)
}
).createDelegate(this);
var g = _S("dsm_https_port");
var k = Ext.urlEncode({
action: "signin",
method: "azure_oidc",
origin: location.origin
});
var j = location.hostname;
var h = "https://" + j + ":" + g + "/webman/index.cgi?" + k;
window.addEventListener("message", f);
window.open(h, "OIDC", b)
},
logout: function() {
var g = Ext.urlEncode({
asso: "true"
});
var f = "webman/logout.cgi?" + g;
window.open(f, "OIDC", b)
}
}
我已经设法使用 sub_filter 来替换简单片段
例如,所有这些示例都运行良好并取代了我的期望:
sub_filter 'dsm_https_port' '443';
sub_filter "dsm_https_port" "443";
sub_filter 'SYNO.SDS.AzureSSOUtils' 'PleaseWorkDamnYou'
我真正想要做的是以下两个替换之一:
sub_filter 'var g = _S("dsm_https_port");' 'var g = 443;';
or
sub filter 'var h = "https://" + j + ":" + g + "/webman/index.cgi?" + k;' 'var h = "https://" + j + + "/webman/index.cgi?" + k;';
但是这两种方法似乎都不起作用。我尝试过通过在空格、引号和分号前面放置 \ 来转义它们 - 虽然这没有出错,但没有什么区别。
我究竟做错了什么? 我认为这是因为要替换的文本中包含歧义字符,但我不确定。
作为参考,是的,我已确保在我的位置部分启用了以下内容(这是大多数文章建议的,首先所有这些都需要能够编辑正在工作的小片段:
gzip off;
proxy_set_header Accept-Encoding "";
sub_filter_once off;
sub_filter_types *;
答案1
好吧,这完全是我的错误(因为我不是程序员)。
我使用 Chrome 的开发者工具查看浏览器使用 Chrome 开发者工具网络选项卡中的预览功能下载的 Desktop.js 文件。它使代码变得漂亮。我从来没有想到它会在感觉良好的地方插入空格。
我在本地下载了未经格式化的 Desktop.js 文件,结果发现我想要替换的文本var g=_S("dsm_https_port")
不是var g = _S("dsm_https_port");
并不是var h="https://"+j+":"+g+"/webman/index.cgi?"+k
var h = "https://" + j + ":" + g + "/webman/index.cgi?" + k
一旦我修复了空格问题并使用转义字符,一切都会按预期工作(我之前尝试过转义,但空格问题是阻碍我的根本问题)。
课程/答案 = 不要看美化后的代码,而要看服务器返回给浏览器的原始文件。
为了答案的完整性,这是最后一个起作用的子过滤器:
sub_filter 'var g=_S(\"dsm_https_port\")' 'var g=443';
感谢大家的评论,这很有帮助。