我与多个用户运行一个Web服务器。 该机器提供基于Apache的虚拟主机给一群可以提供静态内容或使用PHP的用户。 没有其他forms的服务器端脚本可用。
以下是典型请求的处理方式:

HTTPSstream量由Pound剥离SSL,作为反向代理,将请求转发给Varnish,Varnish也充当反向代理,最终将请求转发给Apache。
当HTTPSstream量到达Apache时,协议,端口和完整URL已经从https://example.com:443/更改为http://example.com:8443/ 。 这是Apache之前的所有代理的结果。
有没有一种方法可以欺骗PHP脚本,认为请求来自原始URL,端口和协议, 而无需修改PHP代码 ?
这一点非常重要,因为用户希望运行Joomla,WordPress以及其他基于PHP的CMS,这些CMS可以检测URL并为redirect,链接等造成麻烦。
我可以修补mod_php并从源代码构build它,并对我的特定场景进行必要的更改,但是有没有更好的方法来给PHP脚本伪造环境variables,也许通过php.ini中的某些设置?
我可以find最简单的方法是通过删除mod_php并使用CGI脚本来代替。 这允许你从页面加载执行的shell脚本中调用php-cgi (一个CGI目标版本的PHP解释器)。
这是一个示例bash脚本,它根据X-Forwarded-Proto头设置SERVER_PORT和HTTPS环境variables,然后调用php-cgi :
#!/bin/bash # HTTPS fix (WARNING: THIS HEADER CAN BE FAKED BY THE CLIENT) if [[ "$HTTP_X_FORWARDED_PROTO" == "https" ]]; then export SERVER_PORT=443 export HTTPS="on" else export SERVER_PORT=80 fi php-cgi
当然,你必须小心,因为X-Forwarded-Proto头可以由客户端发送,所以除非你在Apache和客户端之间有一些东西来清理头,否则你不应该相信它! (你可能也想要closuresApache的防火墙,或者更好的办法是让它只在loopback上进行监听)
所有你需要做的就是让Apache使用这个bash脚本来处理每个扩展名为.php ( mod_cgi和mod_actions让你这样做)。