Lighttpd CGI环境下Python脚本被浏览器下载而非执行的问题排查
看起来你已经做了不少基础配置,但Python脚本还是没被正确解析成CGI程序,反而被当作静态文件下载,咱们一步步来排查和解决:
检查配置的重复定义问题
你在全局配置和/cgi-bin/的URL匹配块里都定义了cgi.assign,lighttpd的配置解析顺序可能导致重复配置引发意外。建议去掉全局的cgi.assign,只保留URL匹配块内的配置,避免冲突:server.modules = ( "mod_access", "mod_cgi", "mod_accesslog" ) $HTTP["url"] =~ "^/cgi-bin/" { cgi.assign = ( ".sh" => "/bin/bash", ".py" => "/usr/bin/python" ) }确认Python的shebang路径与配置一致
你的脚本里写的是#!/usr/bin/python,但有些系统里默认的Python路径可能是/usr/bin/python3,或者你的Python实际安装路径不同。可以用which python或which python3命令确认实际路径,然后同步修改脚本的shebang行和lighttpd配置里的路径。确保脚本输出符合CGI规范
这是很容易忽略的点:CGI脚本必须先输出HTTP头信息,再输出内容,两者之间用空行分隔。你的Bash脚本其实也不符合规范,但可能lighttpd做了兼容处理,而Python脚本没有。修改你的test.py:#!/usr/bin/python print "Content-Type: text/plain" print print "Hi from Python"如果是Python3环境,要改成print函数的形式:
#!/usr/bin/python3 print("Content-Type: text/plain") print() print("Hi from Python")没有正确的HTTP头,服务器无法识别这是CGI程序的输出,就会当作静态文件下载。
查看lighttpd错误日志排查细节
可以去lighttpd的日志目录(通常是/var/log/lighttpd/)查看error.log,里面会记录脚本解析失败的具体原因,比如权限问题、路径错误、语法错误等,能帮你快速定位问题。检查模块加载顺序
确保mod_cgi模块在处理静态文件的模块(比如mod_staticfile)之前加载,这样服务器会优先用CGI模块解析/cgi-bin/下的脚本,而不是当作静态文件处理。
备注:内容来源于stack exchange,提问作者jackhab

