一个简单的CGI包装脚本

作者

史提芬·莫奈

最后更新

2006/01/26

介绍

本文档提供了一个简单的shell脚本,可用于“包装”MapServer CGI,以避免在MapServer URL中指定“map”参数(或任何其他选择的参数)。

警告

使用包装脚本效率很低,因为它意味着生成两个进程(shell+mapserv),而不是只生成一个进程(mapserv),不应在生产安装中使用。参照 更改联机资源URL 有关如何使用Web服务器配置选项直接设置类似功能的示例。

脚本信息

如果要避免在MapServer URL中指定“map”参数,一种解决方案是使用“wrapper”。基本上,包装器是一个CGI程序,它接收一个传入的CGI请求,以某种方式修改请求参数,然后将实际处理交给另一个CGI程序(如MapServer)。

下面的shell脚本是CGI GET请求的包装器,这些请求应该足够通用,可以在任何具有/bin/sh的操作系统上运行。

替代方案1

#!/bin/sh
MAPSERV="/path/to/my/mapserv"
MS_MAPFILE="/path/to/my/mapfile.map" exec ${MAPSERV}

您应该根据您的配置设置mapserv和ms_mapfile变量。mapserv指向您的mapserver可执行文件,ms_mapfile指向您希望mapserver使用的mapfile。这两个变量都应该是Web服务器有权访问的绝对文件路径,尽管它们不需要(也可能不应该)位于Web可访问的位置。将脚本放在Web服务器的cgi-bin目录中,并使其可执行。

此解决方案应同时支持GET和POST请求。

替代方案2

#!/bin/sh
MAPSERV="/path/to/my/mapserv"
MAPFILE="/path/to/my/mapfile.map"
if [ "${REQUEST_METHOD}" = "GET" ]; then
  if [ -z "${QUERY_STRING}" ]; then
    QUERY_STRING="map=${MAPFILE}"
  else
    QUERY_STRING="map=${MAPFILE}&${QUERY_STRING}"
  fi
  exec ${MAPSERV}
else
  echo "Sorry, I only understand GET requests."
fi
exit 1
# End of Script

您应该根据您的配置设置mapserv和mapfile变量。mapserv指向您的mapserver可执行文件,mapfile指向您希望mapserver使用的mapfile。这两个变量都应该是Web服务器有权访问的绝对文件路径,尽管它们不需要(也可能不应该)位于Web可访问的位置。然后将脚本放在Web服务器的cgi-bin目录中,并使其可执行。

尽管此脚本只设置“map”参数,但也很容易修改为设置任何数量的其他mapserver参数。例如,如果要强制mapserver进入“map”模式,只需将“mode=map”添加到查询字符串变量的前面。只需记住用符号(&)分隔参数。

最后,请注意,该脚本仅适用于GET请求。