Windows 下 Apache 2.4 使用代理转发 PHP 请求出现 No input file specified

Php 2020-04-25 阅读 55 评论 0

问题描述

系统环境和软件版本:

  • Windowns 10
  • Apache httpd-2.4.41-win64-VS16
  • php-7.4.5-nts-Win32-vc15-x64

尝试结合 Apache 2.4 的 proxy_moduleproxy_fcgi_module 模块,将 php 的请求转发给 fCGI 后端处理。类似 Linux 系统 nginx 整合 php-fpm 的处理方式。

1. 添加模块

注释 httpd.conf 的2个模块

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

2. 增加配置

使用 Files 或者 FilesMatch 指令将 *.php 的请求代理到 proxy:fcgi://127.0.0.1:9000#

<Files ~ "\.php$">
    SetHandler "proxy:fcgi://127.0.0.1:9000#"
</Files>

3. 启用 php-cgi

在 cmd 窗口中,运行 php-cgi.exe -b 127.0.0.1:9000 -c php.ini 。

D:\develop\opt\php-7.4.5-nts>php-cgi.exe -b 127.0.0.1:9000 -c php.ini

访问 http://localhost/test.php 时,出现错误 

No input file specified.

解决办法

在 Apache 2.4.23 以上,必须指定 ProxyFCGIBackendType ,即指定后端 FastCGI 应用程序的类型,有FPM 和 GENERIC 2个值可选,指定 GENERIC 即可。

在 httpd.conf 中,加多一行

ProxyFCGIBackendType GENERIC

但是遗憾的是,这一方式至今只能在 php 7+ 上生效,本人测试了 php 5.6、php 5.5、php 5.4,不幸的是都出现了 No input file specified. 的错误。

最后更新 2020-04-25
MIP.watch('startSearch', function (newVal, oldVal) { if(newVal) { var keyword = MIP.getData('keyword'); console.log(keyword); // 替换当前历史记录,新增 MIP.viewer.open('/s/' + keyword, {replace: true}); setTimeout(function () { MIP.setData({startSearch: false}) }, 1000); } }); MIP.watch('goHome', function (newVal, oldVal) { MIP.viewer.open('/', {replace: false}); });