如何仅将Apache中缺失的cgi-scripts代理或重写至Nodejs Express服务
解决方案
首先你需要先启用Apache的三个核心模块,Debian/Ubuntu环境执行以下命令:
a2enmod rewrite proxy proxy_http systemctl restart apache2
如果是CentOS/RHEL环境,直接编辑/etc/httpd/conf/httpd.conf,确认以下三行没有被注释:
LoadModule rewrite_module modules/mod_rewrite.so LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so
之后重启httpd服务即可。
然后修改你的站点配置,核心修正点有四个:
- 删掉全局的
ProxyPass "/cgi-bin" "http://127.0.0.1:8080/cgi-bin"配置,全局ProxyPass优先级高于目录内的重写规则,会强制转发所有请求 - 补全
RewriteEngine On配置,你之前的重写规则不生效就是因为缺了这行 - 修正
RewriteBase为URL路径而非文件系统路径 - 把重写规则的
[R,L]改为[P,L],P标志表示内部代理而非外部跳转
完整配置如下:
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin/"> AllowOverride None Options +ExecCGI -Indexes -MultiViews +SymLinksIfOwnerMatch Require all granted RewriteEngine On RewriteBase "/cgi-bin/" # 仅当请求对应的本地文件、目录都不存在时,才触发代理 RewriteCond "%{REQUEST_FILENAME}" !-f RewriteCond "%{REQUEST_FILENAME}" !-d RewriteRule "(.*)" "http://127.0.0.1:8080/cgi-bin/$1" [P,L] </Directory> # 配置反向代理修正后端返回的重定向地址 ProxyPassReverse "/cgi-bin/" "http://127.0.0.1:8080/cgi-bin/"
验证逻辑
- 访问
/cgi-bin/script1.cgi:对应/usr/lib/cgi-bin/script1.cgi文件存在,不触发重写规则,Apache直接执行CGI返回结果 - 访问
/cgi-bin/script2.cgi:对应本地文件不存在,触发重写规则,内部代理到8080端口的Node服务,用户侧不会感知到端口变化
如果需要调试规则匹配情况,可以在配置中加入LogLevel alert rewrite:trace3,重写的匹配日志会输出到Apache的错误日志中,方便排查问题。
内容的提问来源于stack exchange,提问作者Jeyaprakash
相关产品推荐
相关产品推荐

