Apache mod_rewrite配置:隐藏MAP参数文件路径并保留其他URL参数
Apache Rewrite规则配置与RewriteMap多项目映射方案
一、单个MAP参数的规则修复
你之前的规则失效主要有两个核心问题:一是使用R=301外部重定向会暴露改写后的完整路径,不符合"隐藏路径"的需求;二是正则匹配逻辑冗余,参数拼接易出错。以下是修复后的内部改写规则(需配合原有ProxyPass配置使用):
# 启用Rewrite引擎 RewriteEngine On # 匹配MAP=katastry的请求,内部替换为完整项目路径 RewriteCond %{QUERY_STRING} (.*)(^|&)MAP=katastry(&|$)(.*) RewriteRule ^/qgisserver(.*)$ /qgisserver$1?%1MAP=c:/OSGEO4W/apps/qgis/bin/projects/katastry/katastry.qgs%3 [PT,NC,L] # 原有ProxyPass配置保持不变 ProxyPass /qgisserver http://qgis.demo:8080/cgi-bin/qgis_mapserv.fcgi.exe ProxyPassReverse /qgisserver http://qgis.demo:8080/cgi-bin/qgis_mapserv.fcgi.exe
规则关键说明:
PT标志:让Rewrite处理后的请求继续通过ProxyPass转发到后端FCGI程序,实现内部改写不暴露路径。- 正则
(.*)(^|&)MAP=katastry(&|$)(.*):兼容MAP参数在URL query的开头、中间、结尾等所有位置,同时保留其他参数不丢失。 NC忽略大小写增强兼容性,L停止后续规则处理避免冲突。
二、多MAP参数的RewriteMap方案
使用RewriteMap完全可行,这是管理多项目别名映射最简洁可维护的方式,具体步骤如下:
- 创建映射文件
在服务器上创建一个文本文件(路径可自行调整,比如/etc/apache2/qgis_map_mappings.txt),每行格式为别名 完整项目路径:
katastry c:/OSGEO4W/apps/qgis/bin/projects/katastry/katastry.qgs m1 c:/OSGEO4W/apps/qgis/bin/projects/m1/m1.qgs m2 c:/OSGEO4W/apps/qgis/bin/projects/m2/m2.qgs
- 定义RewriteMap
在Apache全局配置(如httpd.conf)或当前VirtualHost配置中添加映射定义:
RewriteMap qgis_maps txt:/etc/apache2/qgis_map_mappings.txt
- 编写统一Rewrite规则
替换原单项目规则为以下内容,自动匹配映射文件中的所有别名:
RewriteEngine On # 匹配存在MAP参数且别名在映射文件中的请求 RewriteCond %{QUERY_STRING} (.*)(^|&)MAP=([^&]+)(&|$)(.*) RewriteCond ${qgis_maps:%3|NOT_FOUND} !NOT_FOUND RewriteRule ^/qgisserver(.*)$ /qgisserver$1?%1MAP=${qgis_maps:%3}%4 [PT,NC,L] # 原有ProxyPass配置保持不变 ProxyPass /qgisserver http://qgis.demo:8080/cgi-bin/qgis_mapserv.fcgi.exe ProxyPassReverse /qgisserver http://qgis.demo:8080/cgi-bin/qgis_mapserv.fcgi.exe
规则关键说明:
- 第二个
RewriteCond用于校验MAP参数的别名是否存在于映射文件中,不存在则跳过规则。 ${qgis_maps:%3}会自动根据捕获到的别名(%3)替换为对应的完整路径,无需为每个项目单独写规则。
内容的提问来源于stack exchange,提问作者Pepa Beneš
相关产品推荐
相关产品推荐

