首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当字符串有歧义字符时,nginx sub_filter指令的正确语法是什么?

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

Server Fault用户
提问于 2020-09-14 04:30:35
回答 1查看 2.9K关注 0票数 0

我试图使用sub_过滤器来替换.js文件中的代码片段。

代码语言:javascript
复制
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替换了简单的片段

例如,所有这些示例都能很好地工作,并替换我所期望的:

代码语言:javascript
复制
sub_filter              'dsm_https_port' '443';
sub_filter              "dsm_https_port" "443";
sub_filter              'SYNO.SDS.AzureSSOUtils' 'PleaseWorkDamnYou'

我真正想做的是这两种替代品之一:

代码语言:javascript
复制
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;'; 

然而,这两种方法似乎都没有起到任何作用。我试着转义每个空格,引号和分号,把\放在它们前面--虽然这没有错误,但没有什么区别。

我做错了什么?我认为这是因为要替换的文本中有模糊的字符,但我不确定。

作为参考,是的,我确保在我的位置部分中启用了以下内容(这是大多数文章所建议的,首先,所有这些都需要能够编辑正在工作的小片段:

代码语言:javascript
复制
        gzip                    off;    
        proxy_set_header        Accept-Encoding         "";
        sub_filter_once         off;
        sub_filter_types        *;
EN

回答 1

Server Fault用户

发布于 2020-09-14 19:02:11

好的,这完全是我的错误(来自于不是一个程序员)。

我使用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:

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

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

票数 1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/1033761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档