Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Remove .html extension using Google Appengine with Java

I am incredibly confused here. I've been using Google Appengine for our webserver and it's been working out great so far, but I had a request to have the webpages load without the .html extension. I've been doing some reading and see that I need to create an app.yaml file to map the url to something else? This is what I have in my file so far:

application: company-website
version: 1
runtime: java
threadsafe: true

handlers:
  - url: /about
  script: about.html

I've been trying to read how to do this on their documentation site but I can't seem to find anything referencing how to remove the extension and still have it point to the right html file. Can anyone help me out? Can I just do this in the appengine-web.xml file, also? It seems like I could just do it in there without creating an app.yaml file.

Any help would be appreciated. Thanks!

edit: tried some more things.. Tried moving the file I'm trying to remove the extension on to its own folder like so:

/root
  -index.html
  -/about
     -index.html

And this was OK, when I typed my domain.com/about/ it appears to be working but when I typed domain.com/about it does not. Very frustrating.

like image 273
shan Avatar asked Sep 15 '15 00:09

shan


2 Answers

In an ideal world we would have the option to configure a rewrite like apache's mod_rewrite in the underlying web server. Sadly it is not possible to configure a rewrite on such a level.

I searched around a bit and found that the most common answer for a rewrite is to user either UrlRewriteFilter or to wire up the servlets yourself. Both options are explained in

  • Catch-all URL rewrite on Google App Engine (Java)
  • Pretty URLs in Google App Engine

Both work in the same way and will require the app to serve static content through app engine. This will result in app engine instance hours and slower responses since all you static files move from Google's content delivery network (cdn) to your bottleneck app. The aproaches possibly also require you to deploy your static files as resource instead (How-To configure static-files and resources), at least that is how i have done this before.

These are the 'pure Java' options you have. The app.yaml approach that Josep Valls described will work in with Java on App Engine. The main question here is if the app.yaml configuration is low level enough to be a rewrite that google recognizes in its cdn, or whether you'll still burn through instance hours because all content is served through instances.

The documentation tells us:

For efficiency, App Engine stores and serves static files separately from application files. Static files are not available in the application's file system. If you have data files that need to be read by the application code, the data files must be application files, and must not be matched by a static file pattern.

Since this comes right before the section that explains how to configure the static file pattern handlers one should assume that the configuration of such handlers will not break the logic that is mentioned above - that is

stores and serves static files separately from application files

Whether this assumption is correct is an easy experiment which i shall conduct given time and report my findings here.

These are all the existing options I could find and know of. If anyone knows more on this topic, please comment / respond.

EDIT (7.12.2015) My maven target appengine:devserver is completely oblivious to settings in the app.yaml. I'll have to experiment with this during one of the next deployment phases or use mvn gcloud:run.

... later that day:

Rewriting the URL via Servlet (like with Paul Tuckey's UrlRewriteFilter) does not work for static files. You would have to deploy the files as resource files. Static files reside somewhere else and will not be found if forwarded to by a servlet. At least that's how i understand it.

like image 156
konqi Avatar answered Nov 10 '22 19:11

konqi


In Python and Go you can use regular expression matching in your url handlers; if Java also uses app.yaml you could probably do this:

- url: /(about|other|sections)$
  static_files: \1\.html
like image 41
Josep Valls Avatar answered Nov 10 '22 17:11

Josep Valls