diff --git a/web/public/js/components.js b/web/public/js/components.js index 0cad2ce7..65197035 100644 --- a/web/public/js/components.js +++ b/web/public/js/components.js @@ -2366,7 +2366,7 @@ Vue.component("traffic-map-box",{props:["v-stats","v-is-attack"],mounted:functio -`}),Vue.component("http-firewall-checkpoint-cc",{props:["v-checkpoint"],data:function(){let e=[],t=60,i=1e3,n=!1,s=!0,o={},a=(null==(o=null!=window.parent.UPDATING_RULE?window.parent.UPDATING_RULE.checkpointOptions:o)&&(o={}),0==(e=null!=o.keys?o.keys:e).length&&(e=["${remoteAddr}","${requestPath}"]),null!=o.period&&(t=o.period),null!=o.threshold&&(i=o.threshold),null!=o.ignoreCommonFiles&&"boolean"==typeof o.ignoreCommonFiles&&(n=o.ignoreCommonFiles),null!=o.enableFingerprint&&"boolean"==typeof o.enableFingerprint&&(s=o.enableFingerprint),this);return setTimeout(function(){a.change()},100),{keys:e,period:t,threshold:i,ignoreCommonFiles:n,enableFingerprint:s,options:{},value:i}},watch:{period:function(){this.change()},threshold:function(){this.change()},ignoreCommonFiles:function(){this.change()},enableFingerprint:function(){this.change()}},methods:{changeKeys:function(e){this.keys=e,this.change()},change:function(){let e=parseInt(this.period.toString()),t=((isNaN(e)||e<=0)&&(e=60),parseInt(this.threshold.toString())),i=((isNaN(t)||t<=0)&&(t=1e3),this.value=t,this.ignoreCommonFiles),n=("boolean"!=typeof i&&(i=!1),this.enableFingerprint);"boolean"!=typeof n&&(n=!0),this.vCheckpoint.options=[{code:"keys",value:this.keys},{code:"period",value:e},{code:"threshold",value:t},{code:"ignoreCommonFiles",value:i},{code:"enableFingerprint",value:n}]},thresholdTooLow:function(){let e=parseInt(this.threshold.toString());return 0<(e=isNaN(e)||e<=0?1e3:e)&&e<5}},template:`
+
`}),Vue.component("http-firewall-checkpoint-cc",{props:["v-checkpoint"],data:function(){let e=[],t=60,i=1e3,n=!0,s=!0,o={},a=(null==(o=null!=window.parent.UPDATING_RULE?window.parent.UPDATING_RULE.checkpointOptions:o)&&(o={}),0==(e=null!=o.keys?o.keys:e).length&&(e=["${remoteAddr}","${requestPath}"]),null!=o.period&&(t=o.period),null!=o.threshold&&(i=o.threshold),null!=o.ignoreCommonFiles&&"boolean"==typeof o.ignoreCommonFiles&&(n=o.ignoreCommonFiles),null!=o.enableFingerprint&&"boolean"==typeof o.enableFingerprint&&(s=o.enableFingerprint),this);return setTimeout(function(){a.change()},100),{keys:e,period:t,threshold:i,ignoreCommonFiles:n,enableFingerprint:s,options:{},value:i}},watch:{period:function(){this.change()},threshold:function(){this.change()},ignoreCommonFiles:function(){this.change()},enableFingerprint:function(){this.change()}},methods:{changeKeys:function(e){this.keys=e,this.change()},change:function(){let e=parseInt(this.period.toString()),t=((isNaN(e)||e<=0)&&(e=60),parseInt(this.threshold.toString())),i=((isNaN(t)||t<=0)&&(t=1e3),this.value=t,this.ignoreCommonFiles),n=("boolean"!=typeof i&&(i=!1),this.enableFingerprint);"boolean"!=typeof n&&(n=!0),this.vCheckpoint.options=[{code:"keys",value:this.keys},{code:"period",value:e},{code:"threshold",value:t},{code:"ignoreCommonFiles",value:i},{code:"enableFingerprint",value:n}]},thresholdTooLow:function(){let e=parseInt(this.threshold.toString());return 0<(e=isNaN(e)||e<=0?1e3:e)&&e<5}},template:`
@@ -2403,7 +2403,7 @@ Vue.component("traffic-map-box",{props:["v-stats","v-is-attack"],mounted:functio
忽略常用文件 -

忽略js、css、jpg等常在网页里被引用的文件名,可以减少误判几率。

+

忽略js、css、jpg等常在网页里被引用的文件名,即对这些文件的访问不加入计数,可以减少误判几率。

@@ -2534,15 +2534,15 @@ Vue.component("traffic-map-box",{props:["v-stats","v-is-attack"],mounted:functio {{origin.addr}}  
- 对象存储 - {{origin.name}} - 证书 - 主机名: {{origin.host}} - 端口跟随 - HTTP/2 + 对象存储 + {{origin.name}} + 证书 + 主机名: {{origin.host}} + 端口跟随 + HTTP/2 - 匹配: {{domain}} - 匹配: 所有域名 + 匹配: {{domain}} + 匹配: 所有域名
{{origin.weight}} @@ -2935,9 +2935,8 @@ Vue.component("traffic-map-box",{props:["v-stats","v-is-attack"],mounted:functio 匹配条件 - + -
@@ -3035,7 +3034,7 @@ example2.com
  -`}),Vue.component("http-referers-config-box",{props:["v-referers-config","v-is-location","v-is-group"],data:function(){let e=this.vReferersConfig;return null==(e=null==e?{isPrior:!1,isOn:!1,allowEmpty:!0,allowSameDomain:!0,allowDomains:[],denyDomains:[],checkOrigin:!0}:e).allowDomains&&(e.allowDomains=[]),null==e.denyDomains&&(e.denyDomains=[]),{config:e}},methods:{isOn:function(){return(!this.vIsLocation&&!this.vIsGroup||this.config.isPrior)&&this.config.isOn},changeAllowDomains:function(e){"object"==typeof e&&(this.config.allowDomains=e,this.$forceUpdate())},changeDenyDomains:function(e){"object"==typeof e&&(this.config.denyDomains=e,this.$forceUpdate())}},template:`
+
`}),Vue.component("http-referers-config-box",{props:["v-referers-config","v-is-location","v-is-group"],data:function(){let e=this.vReferersConfig;return null==(e=null==e?{isPrior:!1,isOn:!1,allowEmpty:!0,allowSameDomain:!0,allowDomains:[],denyDomains:[],checkOrigin:!0}:e).allowDomains&&(e.allowDomains=[]),null==e.denyDomains&&(e.denyDomains=[]),{config:e,moreOptionsVisible:!1}},methods:{isOn:function(){return(!this.vIsLocation&&!this.vIsGroup||this.config.isPrior)&&this.config.isOn},changeAllowDomains:function(e){"object"==typeof e&&(this.config.allowDomains=e,this.$forceUpdate())},changeDenyDomains:function(e){"object"==typeof e&&(this.config.denyDomains=e,this.$forceUpdate())},showMoreOptions:function(){this.moreOptionsVisible=!this.moreOptionsVisible}},template:`
@@ -3080,6 +3079,11 @@ example2.com

禁止的来源域名列表,比如example.org*.example.org;除了这些禁止的来源域名外,其他域名都会被允许,除非限定了允许的来源域名。

+ + + + + + + + + + + + +
同时检查Origin @@ -3087,6 +3091,20 @@ example2.com

如果请求没有指定Referer Header,则尝试检查Origin Header,多用于跨站调用。

例外URL + +

如果填写了例外URL,表示这些URL跳过不做处理。

+
限制URL + +

如果填写了限制URL,表示只对这些URL进行处理;如果不填则表示支持所有的URL。

+
@@ -4019,7 +4037,7 @@ example2.com
-`}),Vue.component("http-compression-config-box",{props:["v-compression-config","v-is-location","v-is-group"],mounted:function(){let e=this;sortLoad(function(){e.initSortableTypes()})},data:function(){let t=this.vCompressionConfig,e=(null==(t=null==t?{isPrior:!1,isOn:!1,useDefaultTypes:!0,types:["brotli","gzip","zstd","deflate"],level:3,decompressData:!1,gzipRef:null,deflateRef:null,brotliRef:null,minLength:{count:1,unit:"kb"},maxLength:{count:32,unit:"mb"},mimeTypes:["text/*","application/javascript","application/json","application/atom+xml","application/rss+xml","application/xhtml+xml","font/*","image/svg+xml"],extensions:[".js",".json",".html",".htm",".xml",".css",".woff2",".txt"],exceptExtensions:[".apk",".ipa"],conds:null,enablePartialContent:!1}:t).types&&(t.types=[]),null==t.mimeTypes&&(t.mimeTypes=[]),null==t.extensions&&(t.extensions=[]),[{name:"Gzip",code:"gzip",isOn:!0},{name:"Deflate",code:"deflate",isOn:!0},{name:"Brotli",code:"brotli",isOn:!0},{name:"ZSTD",code:"zstd",isOn:!0}]),i=[];return t.types.forEach(function(t){e.forEach(function(e){t==e.code&&(e.isOn=!0,i.push(e))})}),e.forEach(function(e){t.types.$contains(e.code)||(e.isOn=!1,i.push(e))}),{config:t,moreOptionsVisible:!1,allTypes:i}},methods:{isOn:function(){return(!this.vIsLocation&&!this.vIsGroup||this.config.isPrior)&&this.config.isOn},changeExtensions:function(i){i.forEach(function(e,t){0 +`}),Vue.component("http-compression-config-box",{props:["v-compression-config","v-is-location","v-is-group"],mounted:function(){let e=this;sortLoad(function(){e.initSortableTypes()})},data:function(){let t=this.vCompressionConfig,e=(null==(t=null==t?{isPrior:!1,isOn:!1,useDefaultTypes:!0,types:["brotli","gzip","zstd","deflate"],level:0,decompressData:!1,gzipRef:null,deflateRef:null,brotliRef:null,minLength:{count:1,unit:"kb"},maxLength:{count:32,unit:"mb"},mimeTypes:["text/*","application/javascript","application/json","application/atom+xml","application/rss+xml","application/xhtml+xml","font/*","image/svg+xml"],extensions:[".js",".json",".html",".htm",".xml",".css",".woff2",".txt"],exceptExtensions:[".apk",".ipa"],conds:null,enablePartialContent:!1,onlyURLPatterns:[],exceptURLPatterns:[]}:t).types&&(t.types=[]),null==t.mimeTypes&&(t.mimeTypes=[]),null==t.extensions&&(t.extensions=[]),[{name:"Gzip",code:"gzip",isOn:!0},{name:"Deflate",code:"deflate",isOn:!0},{name:"Brotli",code:"brotli",isOn:!0},{name:"ZSTD",code:"zstd",isOn:!0}]),i=[];return t.types.forEach(function(t){e.forEach(function(e){t==e.code&&(e.isOn=!0,i.push(e))})}),e.forEach(function(e){t.types.$contains(e.code)||(e.isOn=!1,i.push(e))}),{config:t,moreOptionsVisible:!1,allTypes:i}},methods:{isOn:function(){return(!this.vIsLocation&&!this.vIsGroup||this.config.isPrior)&&this.config.isOn},changeExtensions:function(i){i.forEach(function(e,t){0 @@ -4107,17 +4125,31 @@ example2.com

支持对分片内容(PartialContent)的压缩;除非客户端有特殊要求,一般不需要启用。

+ + + + + + + + +
例外URL + +

如果填写了例外URL,表示这些URL跳过不做处理。

+
限制URL + +

如果填写了限制URL,表示只对这些URL进行压缩处理;如果不填则表示支持所有的URL。

+
匹配条件 -
-`}),Vue.component("http-cc-config-box",{props:["v-cc-config","v-is-location","v-is-group"],data:function(){let e=this.vCcConfig;return null!=(e=null==e?{isPrior:!1,isOn:!1,enableFingerprint:!0,enableGET302:!0,onlyURLPatterns:[],exceptURLPatterns:[],useDefaultThresholds:!0,ignoreCommonFiles:!1}:e).thresholds&&0!=e.thresholds.length||(e.thresholds=[{maxRequests:0},{maxRequests:0},{maxRequests:0}]),"boolean"!=typeof e.enableFingerprint&&(e.enableFingerprint=!0),"boolean"!=typeof e.enableGET302&&(e.enableGET302=!0),null==e.onlyURLPatterns&&(e.onlyURLPatterns=[]),null==e.exceptURLPatterns&&(e.exceptURLPatterns=[]),{config:e,moreOptionsVisible:!1,minQPSPerIP:e.minQPSPerIP,useCustomThresholds:!e.useDefaultThresholds,thresholdMaxRequests0:this.maxRequestsStringAtThresholdIndex(e,0),thresholdMaxRequests1:this.maxRequestsStringAtThresholdIndex(e,1),thresholdMaxRequests2:this.maxRequestsStringAtThresholdIndex(e,2)}},watch:{minQPSPerIP:function(e){let t=parseInt(e.toString());(isNaN(t)||t<0)&&(t=0),this.config.minQPSPerIP=t},thresholdMaxRequests0:function(e){this.setThresholdMaxRequests(0,e)},thresholdMaxRequests1:function(e){this.setThresholdMaxRequests(1,e)},thresholdMaxRequests2:function(e){this.setThresholdMaxRequests(2,e)},useCustomThresholds:function(e){this.config.useDefaultThresholds=!e}},methods:{maxRequestsStringAtThresholdIndex:function(t,i){if(null==t.thresholds)return"";if(i +`}),Vue.component("http-cc-config-box",{props:["v-cc-config","v-is-location","v-is-group"],data:function(){let e=this.vCcConfig;return null!=(e=null==e?{isPrior:!1,isOn:!1,enableFingerprint:!0,enableGET302:!0,onlyURLPatterns:[],exceptURLPatterns:[],useDefaultThresholds:!0,ignoreCommonFiles:!0}:e).thresholds&&0!=e.thresholds.length||(e.thresholds=[{maxRequests:0},{maxRequests:0},{maxRequests:0}]),"boolean"!=typeof e.enableFingerprint&&(e.enableFingerprint=!0),"boolean"!=typeof e.enableGET302&&(e.enableGET302=!0),null==e.onlyURLPatterns&&(e.onlyURLPatterns=[]),null==e.exceptURLPatterns&&(e.exceptURLPatterns=[]),{config:e,moreOptionsVisible:!1,minQPSPerIP:e.minQPSPerIP,useCustomThresholds:!e.useDefaultThresholds,thresholdMaxRequests0:this.maxRequestsStringAtThresholdIndex(e,0),thresholdMaxRequests1:this.maxRequestsStringAtThresholdIndex(e,1),thresholdMaxRequests2:this.maxRequestsStringAtThresholdIndex(e,2)}},watch:{minQPSPerIP:function(e){let t=parseInt(e.toString());(isNaN(t)||t<0)&&(t=0),this.config.minQPSPerIP=t},thresholdMaxRequests0:function(e){this.setThresholdMaxRequests(0,e)},thresholdMaxRequests1:function(e){this.setThresholdMaxRequests(1,e)},thresholdMaxRequests2:function(e){this.setThresholdMaxRequests(2,e)},useCustomThresholds:function(e){this.config.useDefaultThresholds=!e}},methods:{maxRequestsStringAtThresholdIndex:function(t,i){if(null==t.thresholds)return"";if(i @@ -4154,7 +4186,7 @@ example2.com @@ -5817,7 +5849,7 @@ example2.com
忽略常用文件 -

忽略js、css、jpg等常在网页里被引用的文件名,可以减少误判几率。

+

忽略js、css、jpg等常在网页里被引用的文件名,即对这些文件的访问不加入计数,可以减少误判几率。

-`}),Vue.component("user-agent-config-box",{props:["v-is-location","v-is-group","value"],data:function(){let e=this.value;return null==(e=null==e?{isPrior:!1,isOn:!1,filters:[]}:e).filters&&(e.filters=[]),{config:e,isAdding:!1,addingFilter:{keywords:[],action:"deny"}}},methods:{isOn:function(){return(!this.vIsLocation&&!this.vIsGroup||this.config.isPrior)&&this.config.isOn},remove:function(e){let t=this;teaweb.confirm("确定要删除此名单吗?",function(){t.config.filters.$remove(e)})},add:function(){this.isAdding=!0},confirm:function(){if("deny"==this.addingFilter.action)this.config.filters.push(this.addingFilter);else{let i=-1;this.config.filters.forEach(function(e,t){"allow"==e.action&&(i=t)}),i<0?this.config.filters.unshift(this.addingFilter):this.config.filters.$insert(i+1,this.addingFilter)}this.cancel()},cancel:function(){this.isAdding=!1,this.addingFilter={keywords:[],action:"deny"}},changeKeywords:function(e){this.addingFilter.keywords=e}},template:`
+`}),Vue.component("user-agent-config-box",{props:["v-is-location","v-is-group","value"],data:function(){let e=this.value;return null==(e=null==e?{isPrior:!1,isOn:!1,filters:[]}:e).filters&&(e.filters=[]),{config:e,isAdding:!1,addingFilter:{keywords:[],action:"deny"},moreOptionsVisible:!1,batchKeywords:""}},methods:{isOn:function(){return(!this.vIsLocation&&!this.vIsGroup||this.config.isPrior)&&this.config.isOn},remove:function(e){let t=this;teaweb.confirm("确定要删除此名单吗?",function(){t.config.filters.$remove(e)})},add:function(){this.isAdding=!0;let e=this;setTimeout(function(){e.$refs.batchKeywords.focus()})},confirm:function(){if("deny"==this.addingFilter.action)this.config.filters.push(this.addingFilter);else{let i=-1;this.config.filters.forEach(function(e,t){"allow"==e.action&&(i=t)}),i<0?this.config.filters.unshift(this.addingFilter):this.config.filters.$insert(i+1,this.addingFilter)}this.cancel()},cancel:function(){this.isAdding=!1,this.addingFilter={keywords:[],action:"deny"},this.batchKeywords=""},changeKeywords:function(e){let t=e.split(/\n/),i=[];t.forEach(function(e){e=e.trim(),i.$contains(e)||i.push(e)}),this.addingFilter.keywords=i},showMoreOptions:function(){this.moreOptionsVisible=!this.moreOptionsVisible}},template:`
@@ -5867,8 +5899,8 @@ example2.com @@ -5887,6 +5919,25 @@ example2.com + + + + + + + + + + + + +
UA关键词 - -

不区分大小写,比如Chrome;支持*通配符,比如*Firefox*;也支持空的关键词,表示空UserAgent。

+ +

每行一个关键词;不区分大小写,比如Chrome;支持*通配符,比如*Firefox*;也支持空行关键词,表示空UserAgent。

例外URL + +

如果填写了例外URL,表示这些URL跳过不做处理。

+
限制URL + +

如果填写了限制URL,表示只对这些URL进行处理;如果不填则表示支持所有的URL。

+
@@ -6588,7 +6639,7 @@ example2.com
{{addr.protocol}}://{{addr.host.quoteIP()}}*:{{addr.portRange}}
-
`}),Vue.component("url-patterns-box",{props:["value"],data:function(){let e=[];return{patterns:e=null!=this.value?this.value:e,isAdding:!1,addingPattern:{type:"wildcard",pattern:""},editingIndex:-1,patternIsInvalid:!1,windowIsSmall:window.innerWidth<600}},methods:{add:function(){this.isAdding=!0;let e=this;setTimeout(function(){e.$refs.patternInput.focus()})},edit:function(e){this.isAdding=!0,this.editingIndex=e,this.addingPattern={type:this.patterns[e].type,pattern:this.patterns[e].pattern}},confirm:function(){if(0==this.addingPattern.pattern.trim().length){let e=this;void teaweb.warn("请输入URL",function(){e.$refs.patternInput.focus()})}else this.editingIndex<0?this.patterns.push({type:this.addingPattern.type,pattern:this.addingPattern.pattern}):(this.patterns[this.editingIndex].type=this.addingPattern.type,this.patterns[this.editingIndex].pattern=this.addingPattern.pattern),this.notifyChange(),this.cancel()},remove:function(e){this.patterns.$remove(e),this.cancel(),this.notifyChange()},cancel:function(){this.isAdding=!1,this.addingPattern={type:"wildcard",pattern:""},this.editingIndex=-1},patternTypeName:function(e){switch(e){case"wildcard":return"通配符";case"regexp":return"正则"}return""},notifyChange:function(){this.$emit("input",this.patterns)},changePattern:function(){this.patternIsInvalid=!1;let e=this.addingPattern.pattern;switch(this.addingPattern.type){case"wildcard":0<=e.indexOf("?")&&(this.patternIsInvalid=!0);break;case"regexp":if(0<=e.indexOf("?")){var t=e.split("?");for(let e=0;e +
`}),Vue.component("url-patterns-box",{props:["value"],data:function(){let e=[];return{patterns:e=null!=this.value?this.value:e,isAdding:!1,addingPattern:{type:"wildcard",pattern:""},editingIndex:-1,patternIsInvalid:!1,windowIsSmall:window.innerWidth<600}},methods:{add:function(){this.isAdding=!0;let e=this;setTimeout(function(){e.$refs.patternInput.focus()})},edit:function(e){this.isAdding=!0,this.editingIndex=e,this.addingPattern={type:this.patterns[e].type,pattern:this.patterns[e].pattern}},confirm:function(){if(this.requireURL(this.addingPattern.type)&&0==this.addingPattern.pattern.trim().length){let e=this;return void teaweb.warn("请输入URL",function(){e.$refs.patternInput.focus()})}this.editingIndex<0?this.patterns.push({type:this.addingPattern.type,pattern:this.addingPattern.pattern}):(this.patterns[this.editingIndex].type=this.addingPattern.type,this.patterns[this.editingIndex].pattern=this.addingPattern.pattern),this.notifyChange(),this.cancel()},remove:function(e){this.patterns.$remove(e),this.cancel(),this.notifyChange()},cancel:function(){this.isAdding=!1,this.addingPattern={type:"wildcard",pattern:""},this.editingIndex=-1},patternTypeName:function(e){switch(e){case"wildcard":return"通配符";case"regexp":return"正则";case"images":return"常见图片文件";case"audios":return"常见音频文件";case"videos":return"常见视频文件"}return""},notifyChange:function(){this.$emit("input",this.patterns)},changePattern:function(){this.patternIsInvalid=!1;let e=this.addingPattern.pattern;switch(this.addingPattern.type){case"wildcard":0<=e.indexOf("?")&&(this.patternIsInvalid=!0);break;case"regexp":if(0<=e.indexOf("?")){var t=e.split("?");for(let e=0;e
[{{patternTypeName(pattern.type)}}] {{pattern.pattern}}   @@ -6602,13 +6653,16 @@ example2.com
-
+

通配符正则表达式中不能包含问号(?)及问号以后的内容。

-
+
diff --git a/web/public/js/components.src.js b/web/public/js/components.src.js index f1fcf7c9..fc1845c0 100755 --- a/web/public/js/components.src.js +++ b/web/public/js/components.src.js @@ -6658,7 +6658,7 @@ Vue.component("http-firewall-checkpoint-cc", { let keys = [] let period = 60 let threshold = 1000 - let ignoreCommonFiles = false + let ignoreCommonFiles = true let enableFingerprint = true let options = {} @@ -6812,7 +6812,7 @@ Vue.component("http-firewall-checkpoint-cc", { 忽略常用文件 -

忽略js、css、jpg等常在网页里被引用的文件名,可以减少误判几率。

+

忽略js、css、jpg等常在网页里被引用的文件名,即对这些文件的访问不加入计数,可以减少误判几率。

@@ -7462,15 +7462,15 @@ Vue.component("origin-list-table", { {{origin.addr}}  
- 对象存储 - {{origin.name}} - 证书 - 主机名: {{origin.host}} - 端口跟随 - HTTP/2 + 对象存储 + {{origin.name}} + 证书 + 主机名: {{origin.host}} + 端口跟随 + HTTP/2 - 匹配: {{domain}} - 匹配: 所有域名 + 匹配: {{domain}} + 匹配: 所有域名
{{origin.weight}} @@ -8276,9 +8276,8 @@ Vue.component("uam-config-box", { 匹配条件 - + -
@@ -8698,7 +8697,8 @@ Vue.component("http-referers-config-box", { config.denyDomains = [] } return { - config: config + config: config, + moreOptionsVisible: false } }, methods: { @@ -8716,6 +8716,9 @@ Vue.component("http-referers-config-box", { this.config.denyDomains = domains this.$forceUpdate() } + }, + showMoreOptions: function () { + this.moreOptionsVisible = !this.moreOptionsVisible } }, template: `
@@ -8763,6 +8766,11 @@ Vue.component("http-referers-config-box", {

禁止的来源域名列表,比如example.org*.example.org;除了这些禁止的来源域名外,其他域名都会被允许,除非限定了允许的来源域名。

+ + + + + 同时检查Origin @@ -8770,6 +8778,20 @@ Vue.component("http-referers-config-box", {

如果请求没有指定Referer Header,则尝试检查Origin Header,多用于跨站调用。

+ + 例外URL + + +

如果填写了例外URL,表示这些URL跳过不做处理。

+ + + + 限制URL + + +

如果填写了限制URL,表示只对这些URL进行处理;如果不填则表示支持所有的URL。

+ +
@@ -11045,7 +11067,7 @@ Vue.component("http-compression-config-box", { isOn: false, useDefaultTypes: true, types: ["brotli", "gzip", "zstd", "deflate"], - level: 3, + level: 0, decompressData: false, gzipRef: null, deflateRef: null, @@ -11056,7 +11078,9 @@ Vue.component("http-compression-config-box", { extensions: [".js", ".json", ".html", ".htm", ".xml", ".css", ".woff2", ".txt"], exceptExtensions: [".apk", ".ipa"], conds: null, - enablePartialContent: false + enablePartialContent: false, + onlyURLPatterns: [], + exceptURLPatterns: [] } } @@ -11262,12 +11286,26 @@ Vue.component("http-compression-config-box", {

支持对分片内容(PartialContent)的压缩;除非客户端有特殊要求,一般不需要启用。

+ + + 例外URL + + +

如果填写了例外URL,表示这些URL跳过不做处理。

+ + + + 限制URL + + +

如果填写了限制URL,表示只对这些URL进行压缩处理;如果不填则表示支持所有的URL。

+ 匹配条件 - + @@ -11289,7 +11327,7 @@ Vue.component("http-cc-config-box", { onlyURLPatterns: [], exceptURLPatterns: [], useDefaultThresholds: true, - ignoreCommonFiles: false + ignoreCommonFiles: true } } @@ -11416,7 +11454,7 @@ Vue.component("http-cc-config-box", { 忽略常用文件 -

忽略js、css、jpg等常在网页里被引用的文件名,可以减少误判几率。

+

忽略js、css、jpg等常在网页里被引用的文件名,即对这些文件的访问不加入计数,可以减少误判几率。

@@ -16279,7 +16317,9 @@ Vue.component("user-agent-config-box", { addingFilter: { keywords: [], action: "deny" - } + }, + moreOptionsVisible: false, + batchKeywords: "" } }, methods: { @@ -16294,6 +16334,10 @@ Vue.component("user-agent-config-box", { }, add: function () { this.isAdding = true + let that = this + setTimeout(function () { + that.$refs.batchKeywords.focus() + }) }, confirm: function () { if (this.addingFilter.action == "deny") { @@ -16321,9 +16365,21 @@ Vue.component("user-agent-config-box", { keywords: [], action: "deny" } + this.batchKeywords = "" }, changeKeywords: function (keywords) { - this.addingFilter.keywords = keywords + let arr = keywords.split(/\n/) + let resultKeywords = [] + arr.forEach(function (keyword){ + keyword = keyword.trim() + if (!resultKeywords.$contains(keyword)) { + resultKeywords.push(keyword) + } + }) + this.addingFilter.keywords = resultKeywords + }, + showMoreOptions: function () { + this.moreOptionsVisible = !this.moreOptionsVisible } }, template: `
@@ -16376,8 +16432,8 @@ Vue.component("user-agent-config-box", { UA关键词 - -

不区分大小写,比如Chrome;支持*通配符,比如*Firefox*;也支持空的关键词,表示空UserAgent。

+ +

每行一个关键词;不区分大小写,比如Chrome;支持*通配符,比如*Firefox*;也支持空行关键词,表示空UserAgent。

@@ -16396,6 +16452,25 @@ Vue.component("user-agent-config-box", {
+ + + + + + + 例外URL + + +

如果填写了例外URL,表示这些URL跳过不做处理。

+ + + + 限制URL + + +

如果填写了限制URL,表示只对这些URL进行处理;如果不填则表示支持所有的URL。

+ +
@@ -19506,13 +19581,15 @@ Vue.component("url-patterns-box", { } }, confirm: function () { - let pattern = this.addingPattern.pattern.trim() - if (pattern.length == 0) { - let that = this - teaweb.warn("请输入URL", function () { - that.$refs.patternInput.focus() - }) - return + if (this.requireURL(this.addingPattern.type)) { + let pattern = this.addingPattern.pattern.trim() + if (pattern.length == 0) { + let that = this + teaweb.warn("请输入URL", function () { + that.$refs.patternInput.focus() + }) + return + } } if (this.editingIndex < 0) { this.patterns.push({ @@ -19542,6 +19619,12 @@ Vue.component("url-patterns-box", { return "通配符" case "regexp": return "正则" + case "images": + return "常见图片文件" + case "audios": + return "常见音频文件" + case "videos": + return "常见视频文件" } return "" }, @@ -19568,6 +19651,9 @@ Vue.component("url-patterns-box", { } break } + }, + requireURL: function (patternType) { + return patternType == "wildcard" || patternType == "regexp" } }, template: `
@@ -19584,13 +19670,16 @@ Vue.component("url-patterns-box", {
-
+

通配符正则表达式中不能包含问号(?)及问号以后的内容。

-
+