我需要将通过{{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?)-与httphttps匹配的捕获组(请注意,如果不使用反向引用,则可以删除圆括号)
:\\/\\/-从字面上匹配://(请注意,您不必在构造函数中转义斜线,因为它不允许使用分隔符,因此您可以编写://
(w{3}\\.)?-一个可选的捕获组(由于?量词),与字母w匹配,正好出现3次,并有一个文字点
chateauversailles-匹配指定的字母序列1次
(-spectacles)?-匹配-spectacles或由于?量词不匹配的可选组。
\\.fr/-从字面上匹配.fr/
.+-匹配换行符以外的任何1个或多个字符
$-字符串结尾。

关于javascript - AngularJS $ sceDelegate RegExp:是否将类似的域列入白名单?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30942491/

10-13 01:10