WordPress permalink URLs may contain index.php. The standard way to remove them on an apache server is to use a .htaccess file. However, if you are one of those few people who have wordpress on apache tomcat (application server) and see no advantage in installing a separate web server, there is a way in which ‘index.php’ can be removed from links using a pure J2EE approach.
The tutorial below is generic enough and can be used to clean up a url for any J2EE application. so if you have a link that reads as www.studytrails.com/java/spring.jsp and you want the user to be aware of only www.studytrails.com/java/spring/ then this is the tutorial for you
The concept : We will be using a servlet filter to filter requests. The filter will modify and forward links in a way that is seamless to the user.
Steps:
1. In the web.xml file , add the following lines (note that there is no web.xml in a wordpress application by default, you will have to create a new one and put it in WEB-INF directory of the wordpress application)
<filter-mapping>
<filter-name>BlogFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>BlogFilter</filter-name>
<filter-class>com.studytrails.BlogRedirectingFilter</filter-class>
</filter>
We pass all requests to a filter called BlogRedirectingFilter.
2. Create the Filter. Here’s the filter class
public class BlogRedirectingFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
String requestUrl = request.getServletContext().getContextPath();
String url = ((HttpServletRequest) request).getRequestURL().toString();
if (url.endsWith("css") || url.endsWith("js") || url.endsWith("php")
|| url.contains("index.php") || url.endsWith("png")
|| url.endsWith("gif") || url.endsWith("ico")
|| url.endsWith("jsp") || url.endsWith("jpg")
|| url.endsWith("html") || url.endsWith("blog")
|| url.endsWith("blog/")|| url.endsWith("wp-admin/")) {
System.out.println(url);
} else {
// break and reconstruct URL
String a = url.split("//")[1];
// the context
String context = a.split("/")[1];
if ("blog".equals(context)) {
String[] pathElements = a.split("/");
// reconstruct URL
String newUrl = "/index.php";
for (int i = 2; i < pathElements.length; i++) {
newUrl += "/" + pathElements[i];
}
newUrl += "/";
System.out.println(newUrl);
request.getServletContext().getRequestDispatcher(newUrl)
.forward(request, response);
return;
}
}
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
quite simple actually, you can play around with the code to accomplish whatever you want. i.e. extract data from the request and pass it as parameter, remove parts of a link or beautify a link. Note that since the filter forwards the request, the user does not see the forwarded URL (use a requestdispatcher redirect, if you want user to see the actual URL, but then there is no need for this tutorial…)