Hi All,
Good day All.
We are having an issue - Server Side Includes are not working properly when the
request is being proxy to Tomcat from Apache server. It is working only when we
set the "Options +Includes" in the <proxy> element. Can you please suggest is
the intended behavior.
When the Apache HTTP server is used standalone mode (means without using
Tomcat), SSI is working properly.
Steps to reproduce:
In the Apache httpd.conf file,
1) Enable following modules.
LoadModule include_module modules/mod_include.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
2) Add "Includes" directive to the directory
<Directory />
Options Includes Indexes FollowSymLinks
</Directory>
3) Add following configuration for proxy to Tomcat which is running at port
8080.
<IfModule mod_proxy.c>
ProxyRequests Off
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
</IfModule>
<Proxy *>
Order deny,allow
Allow from all
Options +Includes
</Proxy>
4) Restart Apache server.
Changes to be done on Tomcat server:
1) Open the file \tomcat\conf\web.xml text editor.
2) Uncomment the ssi filter, which looks like below.
<filter>
<filter-name>ssi</filter-name>
<filter-class>
org.apache.catalina.ssi.SSIFilter
</filter-class>
<init-param>
<param-name>contentType</param-name>
<param-value>text/x-server-parsed-html(;.*)?</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>expires</param-name>
<param-value>666</param-value>
</init-param>
<init-param>
<param-name>isVirtualWebappRelative</param-name>
<param-value>false</param-value>
</init-param>
</filter>
3) Uncomment the filter mapping, which looks like below.
<filter-mapping>
<filter-name>ssi</filter-name>
<url-pattern>*.shtml</url-pattern>
</filter-mapping>
4) Uncomment the mime mapping, which looks like below.
<mime-mapping>
<extension>shtml</extension>
<mime-type>text/x-server-parsed-html</mime-type>
</mime-mapping>
5) Go to \tomcat\webapps\ROOT directory, and create a below two files
Create a file named main.shtml, with below content.
<HTML>
<BODY>
main.shtml
<!--#include
virtual="/sub.html" -->
</BODY>
</HTML>
Create a file named sub.html, with below content.
<HTML>
<BODY>
sub.html<br>
<!--#echo
var="DATE_LOCAL"--><br>
<!--#echo var="DATE_GMT"--><br>
Good <!--#if expr="%{TIME_HOUR}
<12" -->
morning!
<!--#else -->
afternoon!
<!--#endif -->
</BODY>
</HTML>
6) Open the file \tomcat\conf\context.xml in text editor and add the attribute
"privileged" to the context node, to look like below.
<Context privileged="true">
7) Restart tomcat server.
Steps to test:
1) In the web browser request for the url http://localhost/main.shtml
2) It should show the content as below.
main.shtml sub.html
Thursday, 01-Nov-2018 12:39:44 India Standard
Time
Thursday, 01-Nov-2018 07:09:44 GMT
Good afternoon!
3) One can note that SSI content from sub.html is included in the response
above.
4) Open the httpd.conf file and remove the "Options +Includes" directive from
the <proxy> node.
5) Restart Apache HTTP server.
6) Request the page again as in step-1, it shows below content.
main.shtml sub.html
Good morning! afternoon!
7) From above, one can notice that SSI script kept inside main.shtml are
honored but not honored which kept in the sub.html file.
8) One can also notice a warning in the log, saying-
[client 127.0.0.1:54818] AH01374: mod_include: Options
+Includes (or IncludesNoExec) wasn't set, INCLUDES filter removed: /main.shtml
Similar to this, there was Bug
33089<https://bz.apache.org/bugzilla/show_bug.cgi?id=33089>, where they used
"Options +Includes" in the global level. But this also not documented. In the
API, nowhere mentioned Options directive can be used at global level.
Questions:
1) Should we need to add Options +Includes in the <proxy> container to get
proxy SSI to work?
2) As per docs, Options directive can be used in <directory> only. Is it also
supposed to use at <proxy>?
Regards,
Rajesh