Static website examples and tips

This page shows examples and tips for using buckets to host a static website.

Specialty pages

Index pages

An index page (also called a webserver directory index) is a file served to visitors when they request a URL that doesn't have an associated file. When you assign a MainPageSuffix property, Cloud Storage looks for a file with that name whose prefix matches the URL the visitor requested.

For example, say you set the MainPageSuffix of your static website to index.html. Additionally, say you have no file named directory in your bucket In this situation, if a user requests the URL, Cloud Storage attempts to serve the file If that file also doesn't exist, Cloud Storage returns an error page.

The MainPageSuffix also controls the file served when users request the top level site. Continuing the above example, if a user requests, Cloud Storage attempts to serve the file

When attempting to access a URL with a trailing slash, such as, see Troubleshooting.

Error page

The error page is the file returned to visitors of your static site who request a URL that does not correspond to an existing file. If you have assigned a MainPageSuffix, Cloud Storage only returns the error page if there is neither a file with the requested name nor an applicable index page.

When returning an error page, the http response code is 404. The property that controls which file acts as the error page is NotFoundPage. If you don't set NotFoundPage, users receive a generic error page.

Website configuration examples

Three-object bucket

Suppose a bucket named has been configured as a website with the following settings and files:

  • MainPageSuffix = "index.html"
  • NotFoundPage = "404.html"
  • The bucket contains three publicly shared objects: "index.html", "404.html", and "dir/index.html".

The following table shows the content served for selected URLs:

URL Requested Content Served HTTP response code
The object "index.html". 200 The object "404.html". 404 The object "dir/index.html". 200 The object "dir/index.html". 301 The object "dir/index.html", assuming no zero-byte object exists for /dir/ 200
A zero byte empty object, if it exists for /dir/. See the Troubleshooting topic for removing this zero byte object. 301

Two-object bucket

Suppose a bucket named has been configured as a website with the following settings and files:

  • MainPageSuffix = "main.html"
  • NotFoundPage = "404.html"
  • The bucket contains two publicly shared objects: "main.html" and "404.html".

The following table shows the content served for selected URLs:

URL Requested Content Served HTTP response code
The object "main.html". 200 The object "404.html". 404

If an object is shared publicly, you can also view that object with the URL:[BUCKET_NAME]/[OBJECT_NAME]

For example, the URL for an index.html object would be:

For more information about working with publicly accessible data, see Accessing Public Data.

Tips for working with a bucket configured as a website

The following are some tips to keep in mind when using a bucket to host a static website.

Adding subdomains

Suppose you also want to serve content at, from a different bucket than the one that serves content at To do so:

  1. Create a new bucket named Because you already verified the domain, you can create buckets to support subdomains without additional verification.

  2. If you followed the tutorial at Hosting a static website to serve your content over HTTPS, edit your load balancer in the Cloud Console as follows:

    1. For Backend configuration, create a new backend bucket test-bucket by selecting the bucket.
    2. For Host and path rules, add a new rule as follows:
      Hosts                  Paths     Backends       /*        test-bucket
    3. For Frontend configuration, add a new Frontend IP and port with the same values as your first configuration, with the following exceptions:

      • For IP address, create and reserve a new IP address.
      • For Certificate, create a new SSL certificate for
  3. After you update the load balancer, add a new A record to your domain registration service using the IP address of the new frontend configuration:

    NAME                  TYPE     DATA
    test                  A        [IP_ADDRESS]

Setting cache parameters

You can control how or if your website assets are cached by configuring the Cache-Control metadata. Generally, only set cache control metadata for objects that are accessible to all anonymous users, which is a requirement for any object served from a Cloud Storage bucket as part of a static website.

Cloud Storage applies a cache control setting of 3600 seconds to objects that are accessible to all anonymous users, unless you specify explicit cache control settings. See Viewing and Editing Metadata for instructions for setting object metadata, such as Cache-Control.

API behavior

The MainPageSuffix and NotFoundPage website configurations are only used for requests that come to Cloud Storage through the CNAME endpoint or through Cloud Load Balancing. For example, a request to shows the index page, but an equivalent request to does not.

Thus, API behavior for requests to Cloud Storage domains, such as, is preserved. For example, you can continue to list objects in the bucket as you would for any other bucket. In the case of the bucket, the object listing you receive includes 404.html and index.html.

Hosting static assets for a dynamic website

You can use Cloud Storage to host static assets for a dynamic website that is hosted, for example, in Google App Engine or in Google Compute Engine. Some benefits of hosting your static assets, like images or JavaScript files, in a bucket include:

  • Cloud Storage behaves essentially like a Content Delivery Network (CDN) with no work on your part because publicly readable objects are, by default, cached in the Cloud Storage network.

  • Bandwidth charges for accessing content typically cost less with Cloud Storage.

  • The load on your web servers is lessened when serving the static content from Cloud Storage.

You can also control caching, such as disabling caching or setting cache lifetime, for your publicly readable static assets by using cache control request headers. For more information, see Setting cache parameters.

When hosting static assets for a dynamic website, you do not need to create DNS records and point to a bucket or load balancer as you do for a static website. For example, you could have a bucket named www_example_com_assets with appropriate assets configured as shared publicly and then access those assets using the Cloud Storage domain. For example, suppose you have the JavaScript file library.js in the bucket www_example_com_assets that is shared publicly, then you can access it as

Monitor your charges

If you are serving assets from a bucket configured as a static website or serving static assets from a bucket for a dynamic website hosted outside of Cloud Storage, you should monitor the charges to your project containing the bucket. Serving content incurs Cloud Storage costs for storing the content, using the network, and performing retrieval operations. For details, see the Cloud Storage Pricing page.

You may also incur networking charges if you use HTTP(S) Load Balancing to set up HTTPS. See Network Pricing for more details.

The simple pricing example on the Cloud Storage pricing page can be used as an approximation for the use case of a low-traffic, static website. You can use the Pricing Calculator to generate a cost estimate based on your projected usage.

New Google Cloud users might be eligible for a free trial.

If you are a current Google Cloud user, you can get a detailed breakdown of your project costs on the billing page.


See Troubleshooting for common issues associated with using a bucket configured to serve static website content.

What's next