MapServer加载瓦片时msLoadMap()报MS_DEFAULT_MAPFILE_PATTERN校验失败求助
报错原因
msLoadMap(): Regular expression error. MS_DEFAULT_MAPFILE_PATTERN validation failed 报错是MapServer内置安全校验机制被触发导致:
- MapServer默认通过正则表达式
^[A-Za-z0-9_/\\.-]+\.map$校验所有map相关参数的合法性,要求传入的mapfile路径必须以.map为后缀,且路径中不能包含方括号、特殊符号等不符合规则的字符。 - 你的tiler脚本逻辑存在缺陷:先手动拼接了固定的
map=/xxx/telus.map参数,之后又将前端请求的所有参数无差别拼接传入mapserv,其中前端传入的map.layer[layer_392].class[0].style[0]参数以map.开头,会被MapServer识别为mapfile路径相关参数,参数中的[、]等字符不符合正则校验规则,直接触发报错。 - 可排除mapfile路径本身的问题:你提供的mapfile存储路径符合正则规则,且截图确认文件存在,路径本身无异常。
解决方法
- 修改tiler脚本过滤非法参数(优先方案)
遍历请求参数时过滤所有以map.开头的动态修改map属性的参数,避免无效参数被传入mapserv,修改后的参数拼接逻辑参考:
if ( @PARAMS ) { foreach ( @PARAMS ) { # 过滤掉所有以map.开头的参数,避免触发校验 next if $_ =~ /^map\./; $NEW_PARAMS .= "&$_=" . uri_escape( $q->param( $_ ) ); } }
- 如果需要保留动态修改图层样式的能力,额外补充配置
- 在mapfile的
WEB>METADATA块中添加运行时修改权限:WEB METADATA # 原有配置保留,新增如下两行 "allow_runtime_config" "ON" "ows_enable_request" "*" END END - 测试环境可通过Apache配置宽松化mapfile校验规则(生产环境不建议使用,会降低安全性):
# 在000-default.conf的VirtualHost块中添加 SetEnv MS_MAP_PATTERN "^/var/www/bin/tile-producer/docker/cron-jobs/mapdata/.*\.map$"
- 验证修复效果
先请求不带动态样式参数的接口验证基础服务可用性:http://localhost:8080/cgi-bin/tiler?layer=layer_392&mode=tile&tilemode=gmap&tile=4%2011%205
如果可以正常返回瓦片,再按需调整动态样式的传参逻辑即可。
内容的提问来源于stack exchange,提问作者sd-gallowaystorm
相关产品推荐
相关产品推荐

