迁移至Google Cloud后表单调用cgi-bin路径重复问题
问题现象
网站从iPage迁移到Google Cloud后,表单提交时生成的请求URL出现重复的cgi-bin路径,示例:
http://34.28.183.10/cgi-bin/cgi-bin/list_directory_1.cgi?directory=%2CBrasil%2CMinas+Gerais&submit_trailing_directory=
手动移除多余的cgi-bin后,以下URL可正常访问:
http://34.28.183.10/cgi-bin/list_directory_1.cgi?directory=%2CBrasil%2CMinas+Gerais&submit_trailing_directory=
环境信息
- CGI脚本
list_directory_1.cgi存放路径:/usr/lib/cgi-bin - 表单调用的Perl代码:
print qq(<form action="cgi-bin/list_directory_1.cgi" method="GET"> );
- Apache2错误日志内容:
[Thu Mar 16 14:39:49.939253 2023] [cgid:error] [pid 5389:tid 140165141997312] [client 107.217.8.189:52312] AH01264: script not found or unable to stat: /usr/lib/cgi-bin/cgi-bin, referer: http://34.28.183.10/cgi-bin/list_directory_1.cgi?directory=%2CBrasil&submit_directory=
问题原因
Apache通过ScriptAlias指令将URL中的/cgi-bin/映射到服务器本地的/usr/lib/cgi-bin/目录。当表单所在页面本身已经处于/cgi-bin/路径下时,表单里用的相对路径cgi-bin/list_directory_1.cgi会在现有路径基础上追加,最终生成/cgi-bin/cgi-bin/list_directory_1.cgi的重复路径,导致Apache在/usr/lib/cgi-bin/cgi-bin下找脚本,自然找不到。
解决方法
1. 改用绝对路径(推荐)
修改表单的action属性,在路径前加上/,明确从网站根目录开始定位:
print qq(<form action="/cgi-bin/list_directory_1.cgi" method="GET"> );
不管当前页面在哪个路径下,绝对路径都会直接指向根目录下的cgi-bin,避免路径叠加。
2. 调整表单相对路径
如果表单所在页面和目标CGI脚本都在cgi-bin目录下,直接去掉action里的cgi-bin/,用脚本文件名即可:
print qq(<form action="list_directory_1.cgi" method="GET"> );
3. 检查Apache配置(可选)
打开Apache配置文件(比如/etc/apache2/apache2.conf或虚拟主机配置文件),确认ScriptAlias配置是否正确:
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
确保没有重复配置/cgi-bin/的映射,也没有其他规则导致路径叠加。如果有多余的映射规则,删除即可。
内容的提问来源于stack exchange,提问作者Marcos Camargo

