Skip to main content

Adding support for path_info to Tomcat

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:
  • news.domain.tld/business
  • news.domain.tld/news
  • news.domain.tld/sports
  • news.domain.tld/world
Using Mura as the content manager for these sites, an article in the sports section might have a URL that looks like:  http://news.domain.tld/sports/index.cfm/new-stadium-announced.  By default, Railo would throw an Error 404 because it can't match that URL to a file in the application.  What Mura wants to do is:
  1. Run the CFML file index.cfm
  2. And read CGI.path_info which is /new-stadium-announced
The remainder of this article is meant to be a three-step reference to setting-up Tomcat in conjunction with Apache httpd in such a way that it won't drop the path_info aspect of a URL.

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

Popular posts from this blog

Skype Now Supports Emergency Calls In the US

With the latest round of updates to Skype , it was noticed today that the instant messaging and VoIP phone service now supports emergency calling in the United States. The release notes for the most recent update to the Android version of Skype indicated that the service now allows calls to be made to US emergency calling systems via 911.  Telephony services like Skype, Google Voice , and Vonage typically don't offer this emergency calling ability without some sort of intermediate step like deferring to the phone's default dialer, as is the case with Voice, or setting up a physical address location ahead of time which is how Vonage handles it. The indication is that Skype will handle the 911 calls natively, but when verifying with an account that does not have a Skype phone number assigned to it, it was found that the instructions in the FAQ explaining how to turn on emergency calling are not accurate. Emergency calling support in Skype for the United States Interestingly, th...

PHP built-in webserver and IPv6 addresses

Though it's difficult to confirm around the Web, it appears as though the IP address scheme the built-in PHP server uses depends on the host name that's provided.  If a fully-qualified domain name (FQDN) is used, such as server.domain.tld, then the built-in server will be listening for IPv6 based requests.  If the server is started with an IPv4 address identified as the host, then it will naturally listen for IPv4 based requests. The closest to anything official around the Web was a comment in the PHP docs that only seeded this conclusion, at best.  But here it is in any case. Built-in web server http://php.net/manual/en/features.commandline.webserver.php#120449 Ultimately, the following answer from Stack Overflow held the "universal" solution.  Thank you dew010. Running PHP 5.4 built-in web server outside localhost http://stackoverflow.com/a/8377378/2487485 Start your development server like: php -S 0.0.0.0:8989

Allow Windows authentication using SQL Server driver with DBeaver

DBeaver will allow Microsoft Windows single sign on access when connecting to Microsoft SQL Server using the SQL Server driver (rather than jTDS ).  From the driver properties settings, set the integratedSecurity flag to true . Open the Connection configuration panel and choose the Driver properties section. Set the integratedSecurity flag to true . A subtle, but important step is to not provide username and password credentials to the connection.