By default Apache Tomcat does not come configured to handle the path_info server variable information commonly found in SES (search engine safe) compatible URLs. An SES URL might look like: www.domain.tld/index.cfm/user/123. Combining Tomcat as the servlet container with other technologies like Railo and Mura, this missing feature can become problematic and frustrating (redundancy provided for emphasis).
A scenario
The path_info data is traditionally available to CFML applications a la the CGI.path_info variable. Applications often refer to this variable to resolve URLs to specific actions or details of the application. One such example is Mura. The CMS (content management system) has the ability to host several sites from a single instance of the application. While most sites are likely set up to be accessed from their own domain names, in some cases, the sites will be accessed through an identifier in the URL. For example, assume the case of a news organization hosting a separate site for each news category. Perhaps like the following:
The fix
STEP 1: Enable the following modules in Apache
File: APACHE/conf/http.conf
Uncomment the following lines to enable the necessary modules.
STEP 2: Add the proxy and rewrite lines
File: APACHE/conf/extra/http-vhosts.conf
NOTE: The lines of interest are those below the comment.
STEP 3: Add a servlet mapping
File: /path/to/server.domain.tld/CONTEXT/WEB-INF/web.xml
NOTE: Fight the urge to use wildcards (*) to keep the servlet mappings to a single entry. The way Tomcat handles wildcards means that a new mapping will be necessary for URLs that include a sub-directory or use a script file other than index.cfm. A couple of examples have been included for this purpose.
Credit goes to Jamie Krug for the work he did on his blog article describing his set-up that use these steps as well.
URL Rewrite Goodies for Apache, Tomcat, Railo and Mura CMS
http://jamiekrug.com/blog/index.cfm/2009/5/22/url-rewrite-goodies-for-apache-tomcat-railo-and-mura-cms
A scenario
The path_info data is traditionally available to CFML applications a la the CGI.path_info variable. Applications often refer to this variable to resolve URLs to specific actions or details of the application. One such example is Mura. The CMS (content management system) has the ability to host several sites from a single instance of the application. While most sites are likely set up to be accessed from their own domain names, in some cases, the sites will be accessed through an identifier in the URL. For example, assume the case of a news organization hosting a separate site for each news category. Perhaps like the following:
- news.domain.tld/business
- news.domain.tld/news
- news.domain.tld/sports
- news.domain.tld/world
- Run the CFML file index.cfm
- And read CGI.path_info which is /new-stadium-announced
The fix
STEP 1: Enable the following modules in Apache
File: APACHE/conf/http.conf
Uncomment the following lines to enable the necessary modules.
- LoadModule proxy_module modules/mod_proxy.so
- LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
- LoadModule rewrite_module modules/mod_rewrite.so
STEP 2: Add the proxy and rewrite lines
File: APACHE/conf/extra/http-vhosts.conf
NOTE: The lines of interest are those below the comment.
<VirtualHost *:80> ServerAdmin administrator@domain.tld ServerName server.domain.tld DocumentRoot "/path/to/server.domain.tld" ErrorLog "/path/to/logs/server.domain.tld-error.log" CustomLog "/path/to/logs/server.domain.tld-access.log" common JkMount /*.cfm mainWorker # The lines from here to the bottom of the block need to be in the directive. ProxyPreserveHost On ProxyPassReverse / ajp://server.domain.tld:8009/ RewriteEngine On RewriteRule ^(.+\.cf[cm])(/.*)?$ ajp://%{HTTP_HOST}:8009$1$2 [P] </VirtualHost>
STEP 3: Add a servlet mapping
File: /path/to/server.domain.tld/CONTEXT/WEB-INF/web.xml
NOTE: Fight the urge to use wildcards (*) to keep the servlet mappings to a single entry. The way Tomcat handles wildcards means that a new mapping will be necessary for URLs that include a sub-directory or use a script file other than index.cfm. A couple of examples have been included for this purpose.
<!-- Servlet handlers to support PATH_INFO (one per directory and CFML file) --> <servlet-mapping> <servlet-name>CFMLServlet</servlet-name> <url-pattern>/index.cfm/*</url-pattern> </servlet-mapping> <!-- Example with an alternate file in the URL (/application.cfm/some/info). --> <servlet-mapping> <servlet-name>CFMLServlet</servlet-name> <url-pattern>/application.cfm/*</url-pattern> </servlet-mapping> <!-- Example with a sub-folder in the URL (/application/index.cfm/some/info). --> <servlet-mapping> <servlet-name>CFMLServlet</servlet-name> <url-pattern>/application/index.cfm/*</url-pattern> </servlet-mapping>
Credit goes to Jamie Krug for the work he did on his blog article describing his set-up that use these steps as well.
URL Rewrite Goodies for Apache, Tomcat, Railo and Mura CMS
http://jamiekrug.com/blog/index.cfm/2009/5/22/url-rewrite-goodies-for-apache-tomcat-railo-and-mura-cms
Comments
Post a Comment