SSI(Server Side Includes)跨服务器差异咨询及Apache服务器SSI条件表达式异常修复求助
看起来你这是碰到了Apache SSI条件表达式解析的跨配置坑了!这种情况我之前帮朋友排查过,大概率是两台服务器的SSI表达式解析逻辑不一致导致的,尤其是Apache 2.4版本前后的解析器差异,而且大部分情况确实可以通过.htaccess来调整,下面给你一步步来:
先试最可能解决问题的配置:
SSILegacyExprParser
Apache 2.4之后换了新的表达式解析器,而老版本(比如2.2及之前)用的是旧的解析逻辑。你的第二台服务器应该是用了新的解析器,才会把1<0这种明显为假的表达式判断成真。你只需要在第二台服务器的.htaccess里加一行配置,强制它用和第一台一样的旧解析器:SSILegacyExprParser On要注意哦,这个配置需要你的服务器是Apache 2.4及以上版本,而且
.htaccess得有足够的权限(比如主机配置里开了AllowOverride All或者AllowOverride Options=Includes,不然这个指令会不生效)。验证调整后的效果
你可以在第二台服务器上建个测试用的shtml文件,比如test.shtml,内容写:<!--#if expr="1 < 0" --> 带空格的1<0:FALSE <!--#else --> 带空格的1<0:TRUE <!--#endif --> <br> <!--#if expr="1<0" --> 无空格的1<0:FALSE <!--#else --> 无空格的1<0:TRUE <!--#endif --> <br> <!--#if expr="(1 < 0)" --> 带括号空格的(1<0):FALSE <!--#else --> 带括号空格的(1<0):TRUE <!--#endif -->加了配置之后访问这个页面,看看结果是不是和第一台服务器完全一致了。
如果
.htaccess改不了怎么办?
要是你的服务器不允许在.htaccess里改这个配置,那就得联系服务器管理员,让他在httpd.conf或者对应的虚拟主机配置文件里加同样的SSILegacyExprParser On指令,效果是一样的。再补个小排查:对比两台服务器的Apache版本
你可以分别在两台服务器上跑apache2 -v(Debian/Ubuntu系)或者httpd -v(CentOS/RHEL系),看看版本差多少,如果第一台是2.2,第二台是2.4+,那上面的配置肯定能解决问题。
内容来源于stack exchange

