Please note that the contents of this offline web site may be out of date. To access the most recent documentation visit the online version .
Note that links that point to online resources are green in color and will open in a new window.
We would love it if you could give us feedback about this material by filling this form (You have to be online to fill it)



Routing Requests to Modules

HTTP requests from users can reach the appropriate module/version/instance in two ways: A request with a URL that ends at the domain level can be routed according to App Engine's default address routing rules. Alternatively, you can include a dispatch file that routes specific URL patterns according to your own rules.

If you test your app using the development server the available routing and dispatch features are slightly different. To programmatically create URLs that work with both production and development servers, use the ModulesService.getVersionHostname method. See routing in the development server to learn more.

Addressing instances

You can target an HTTP request with varying degrees of specificity. In the following examples appspot.com can be replaced with your app's custom domain if you have one. The URL substrings "instance", "version", "module", and "app-id" represent application and module attributes that you have defined yourself.

These two address forms are guaranteed to reach their target (if it exists). They will never be intercepted and rerouted by a pattern in the dispatch file:

http://instance.version.module.app-id.appspot.com
Sends a request to the named module, version, and instance. This address form can only be used by application administrators.
http://version.module.app-id.appspot.com
Send the request to an available instance of the named module and version (round robin scheduling is used).

These address forms have a default routing behavior. Note that the default routing is overridden if there is a matching pattern in the dispatch file:

http://module.app-id.appspot.com
Send the request to an available instance of the default version of the named module (round robin scheduling is used).
http://version.app-id.appspot.com
Send the request to an available instance of the given version of the default module.
http://app-id.appspot.com
Send the request to an available instance of the default version of the default module.

The default module is defined by explicitly giving a module the name "default," or by not including the name parameter in the module's config file. Requests that specify no module or an invalid module are routed to the default module. You can use the Admin Console to designate a default version for a module, when appropriate.

All modules are public by default, if you want to restrict access to a module, add the “login: admin” parameter to its handlers.

Please note that in April of 2013, Google stopped issuing SSL certificates for double-wildcard domains hosted at appspot.com (i.e. *.*.appspot.com ). If you rely on such URLs for HTTPS access to your application, please change any application logic to use "-dot-" instead of ".". For example, to access version "1" of application "myapp" use "https://1-dot-myapp.appspot.com" instead of "https://1.myapp.appspot.com." If you continue to use "https://1.myapp.appspot.com" the certificate will not match, which will result in an error for any User-Agent that expects the URL and certificate to match exactly.

Dispatch file

You can create a dispatch file to override the default routing for URLs that do not specify a version (described above). This lets you route incoming requests to a specific module based on the path or hostname in the URL. For example, say that you want to route mobile requests like http://simple-sample.appspot.com/mobile/ to a mobile frontend, route worker requests like http://simple-sample.appspot.com/work/ to a static backend, and serve all static content from the default module.

To do this you can create a custom routing with a dispatch.xml file. The file should be placed in the WEB-INF directory of the default module.

<?xml version="1.0" encoding="UTF-8"?>
  <dispatch-entries>
    <dispatch>
      <!-- Default module serves the typical web resources and all static resources. -->
      <url>*/favicon.ico</url>
      <module>default</module>
  </dispatch>
  <dispatch>
      <!-- Default module serves simple hostname request. -->
      <url>simple-sample.appspot.com/</url>
      <module>default</module>
  </dispatch>
  <dispatch>
      <!-- Send all mobile traffic to the mobile frontend. -->
      <url>*/mobile/*</url>
      <module>mobile-frontend</module>
  </dispatch>
  <dispatch>
      <!-- Send all work to the one static backend. -->
      <url>*/work/*</url>
      <module>static-backend</module>
  </dispatch>
</dispatch-entries>

The dispatch file can contain up to 10 routing rules. When specifying the url string, neither the hostname nor the path can be longer than 100 characters.

As you can see, dispatch.xml includes support for glob characters. Glob characters can be used only before the hostname and at the end of the path. If you prefer general routing rules that match many possible requests, you could specify the following:

<!-- Send any path that begins with “simple-sample.appspot.com/mobile” to the mobile-frontend module. -->
<url>simple-sample.appspot.com/mobile*</url>
<module>mobile-frontend</module>

<!-- Send any domain/sub-domain with a path that starts with “work” to the static backend module. -->
<url>*/work*</url>
<module>static-backend</module>

You can also write expressions that are more strict:

<!-- Matches the path "/fun", but not "/fun2" or "/fun/other"  -->
<url>*/fun</url>
<module>mobile-frontend</module>

<!-- Matches the hostname 'customer1.myapp.com', but not '1.customer1.myapp.com. -->
<url>customer1.myapp.com/*</url>
<module>static-backend</module>

Routing in the development server

Addressing instances

The development server creates all instances at startup. Note that at this time basic scaling instances are not supported on the development server. Every instance that is created is assigned its own port. The port assignments appear in the server's log message stream. Web clients can communicate with a particular instance by targeting its port. Only one instance (and port) is created for automatic scaled modules. It looks like this in the server log:

INFO: Module instance module2-auto is running at http://localhost:37251/

A unique port is assigned to each instance of a manual scaled module:

INFO: Module instance manualmodule instance 0 is running at http://localhost:43190/
INFO: Module instance manualmodule instance 1 is running at http://localhost:52642/

In addition, each manual scaled module is assigned one extra port so clients can access the module without specifying a specific instance. Requests to this port are automatically routed to one of the configured instances:

INFO: Module instance manualmodule is running at http://localhost:12361/

The following table shows how these modules can be called in the development server and in the App Engine environment:

Module Instance Development Server Address App Engine Address
module2-auto (not used) http://localhost:37251/ http://v1.module2-auto.appid.appspot.com/
manualmodule 0 http://localhost:43190/ http://0.v1.manualmodule.appid.appspot.com/
manualmodule 1 http://localhost:52642/ http://1.v1.manualmodule.appid.appspot.com/
manualmodule (not used) http://localhost:12361/ http://v1.manualmodule.appid.appspot.com/

Dispatch files

All dispatch files are ignored when running the development server. The only way to target instances is through their ports.

Dispatch files and cron files

A routing conflict can occur if your app has a dispatch file and a cron.xml file, and the same URL path appears in both files. The cron file may specify a target module that is not the same as the module associated with the URL in the dispatch file. When the cron job runs, the URL is routed via the dispatch file, and the module specified there overrides the target in the cron file.

Authentication required

You need to be signed in with Google+ to do that.

Signing you in...

Google Developers needs your permission to do that.