我需要将通过{{vars}}
传递给某些iframe src
的某些网址列入白名单。
域名是:
1 : http://chateauversailles.fr
2 : http://www.chateauversailles-spectacles.fr/
这适用于所有#1网址:
$sceDelegateProvider.resourceUrlWhitelist(['self', new RegExp('^(http[s]?):\/\/(w{3}.)?chateauversailles\.fr/.+$')]);
一旦我在域#2上尝试相同的规则:
$sceDelegateProvider.resourceUrlWhitelist(['self', new RegExp('^(http[s]?):\/\/(w{3}.)?chateauversailles\.fr/.+$')]);
$sceDelegateProvider.resourceUrlWhitelist(['self', new RegExp('^(http[s]?):\/\/(w{3}.)?chateauversailles\-spectacles\.fr/.+$')]);
它将中断所有iframe src,包括具有#sce常见错误的域#1调用:
[$sce:insecurl] Blocked loading resource from url not allowed by $sceDelegate policy
。如果我尝试将语句#2放在#1之前,则将域#1的网址列入白名单,但不会将其列入#2。
我怀疑罪魁祸首是正则表达式,但对我来说它们似乎还不错,但显然不足以使$ sce足够。
最佳答案
您可以使用可选组将两个语句“合并”为一个:
$sceDelegateProvider.resourceUrlWhitelist(['self', new RegExp('^(https?):\\/\\/(w{3}\\.)?chateauversailles(-spectacles)?\\.fr/.+$')]);
请注意,在使用RegExp构造函数时,需要使用两次转义。
正则表达式说明:
^
-字符串锚点的开始(https?)
-与http
或https
匹配的捕获组(请注意,如果不使用反向引用,则可以删除圆括号):\\/\\/
-从字面上匹配://
(请注意,您不必在构造函数中转义斜线,因为它不允许使用分隔符,因此您可以编写://
)(w{3}\\.)?
-一个可选的捕获组(由于?
量词),与字母w
匹配,正好出现3次,并有一个文字点chateauversailles
-匹配指定的字母序列1次(-spectacles)?
-匹配-spectacles
或由于?
量词不匹配的可选组。\\.fr/
-从字面上匹配.fr/
.+
-匹配换行符以外的任何1个或多个字符$
-字符串结尾。关于javascript - AngularJS $ sceDelegate RegExp:是否将类似的域列入白名单?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30942491/