当字符串包含歧义字符时,nginx sub_filter 指令的正确语法是什么?

当字符串包含歧义字符时,nginx sub_filter 指令的正确语法是什么?

我正在尝试使用子过滤器在 .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?"+kvar h = "https://" + j + ":" + g + "/webman/index.cgi?" + k

一旦我修复了空格问题并使用转义字符,一切都会按预期工作(我之前尝试过转义,但空格问题是阻碍我的根本问题)。

课程/答案 = 不要看美化后的代码,而要看服务器返回给浏览器的原始文件。

为了答案的完整性,这是最后一个起作用的子过滤器:

sub_filter 'var g=_S(\"dsm_https_port\")' 'var g=443';

感谢大家的评论,这很有帮助。

相关内容