Note: This question could also read:
How to support bookmarking of hashbang-less client side MVC frameworks in Java.
I am transitioning an angular app that uses hashtags
to one that is html5mode
. I have successfully set
$locationProvider.html5Mode(true);
And all links from the landing page (index.html) work fine.
The problem is, if partial URLs are referenced directly, I get a 404, naturally, since the server endpoint definitions aren't coupled to client side-defined routes.
So without HTML5 we get non-SEO friendly hashbangs, but with it we cannot bookmark anything other than the landing page (the page that bootstraps angular).
Why it works if requesting default landing page (index.html) first, ie htpp://mydomain.example/:
Why it doesn't work if (ie) http://mydomain.example/foo
is requested directly from the browser:
Something is missing from this story, I just don't know what. Here are the only two answers I can see...
The AngularJS documentation does in fact mention this
Server side Using this mode requires URL rewriting on server side, basically you have to rewrite all your links to entry point of your application (e.g. index.html)
In this case, one Java-based solution is to tell the server "map all urls to index.html." This can be done in any HTTP Server or container. I implemented this using Java/Servet since I want my application to be HTTP server agnostic (ie Apache versus NginX, or Tomcat/JBoss only).
In web.xml:
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>StaticServlet</servlet-name>
<jsp-file>/index.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>StaticServlet</servlet-name>
<url-pattern>/app</url-pattern>
</servlet-mapping>
And index.jsp simply looks like:
<%@ include file="index.html" %>
And add the following to the tag within index.html:
<base href="/app" />
I spent some time thinking about this for my PHP site. I hang all my server side code off the /api route to keep it separate from Angular. Here is the solution I came up with by updating my apache config:
RewriteEngine on
#let the php framework do its thing
RewriteRule ^(api/.*)$ index.php?url=$1 [QSA,L,NC]
#let angular do its thing
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) index.html [NC,L]
I wrote up how I went about this using the Flight PHP framework at http://www.awnage.com/2013/10/10/taking-flight-with-angularjs/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With