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

Reply via email to