Dan0
Dan0

Reputation: 107

Static website 404 error page for Google App Engine

I have a completely static website that'd I've deployed to Google App Engine, but I cannot get it to return my custom 404 page, just the generic one like this.

<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>404 Not Found</title>
</head>
<body text=#000000 bgcolor=#ffffff>
<h1>Error: Not Found</h1>
<h2>The requested URL <code>/foo</code> was not found on this server.</h2>
<h2></h2>
</body></html>

I've tried all the solutions I can find but still cannot get it to work. I tried adding require_matching_file: true as recommended in this answer but to no avail. I've also tried to "Edit website configuration" under the bucket storage options.

GAE website configuration

This is my app.yaml file.

runtime: php55
api_version: 1
threadsafe: true

# Handle the main page by serving the index page.
handlers:
- url: /$
  static_files: build/index.html
  upload: build/index.html

# Handle folder urls by serving the index.html page inside.
- url: /(.*)/$
  static_files: build/\1/index.html
  upload: build/.*/index.html

# Handle nearly every other file by just serving it.
- url: /(.+)
  static_files: build/\1
  upload: build/(.*)

# all other pages are a 404
- url: /.*
  static_files: build/404.html
  upload: build/404.html

# This doesn't work either
error_handlers:
- file: build/404.html

This is my website's directory structure.

build
│
│   index.html 
│   404.html   
│
└───blog
│   │   index.html 
│   │
│   └───post-1
│       │   index.html 
│       post-2
│       │   index.html 
│       | ...
│
└───data
│   │   blog-posts.json
│   │   projects.json
│
└───img
│   │   image-1.jpg 
│   │   image-2.jpg 
│   | ...
│ 
└───projects
│   │   index.html 
│   │
│   └───project-1
│       │   index.html 
│       project-2
│       │   index.html 
│       | ...
│ 
└───static
│   │
│   └───css
│       │   styles.css
│       js
│       │   scripts.js
│   

Ultimately I'd like to use a PHP 404 page to send the proper 404 header, but right now I'd settle for a plain HTML page.

Upvotes: 1

Views: 1679

Answers (1)

Dan0
Dan0

Reputation: 107

This the app.yaml file that worked for me.

runtime: php55
api_version: 1
threadsafe: true

# Handle the main page by serving the index page.
handlers:
- url: /
  static_files: build/index.html
  upload: build/index.html

# Handle folder urls by serving the index.html page inside
- url: /(.*)/$
  static_files: build/\1/index.html
  upload: build/.*/index.html

# Handle other file types by just serving them
- url: /(.*\.(css|js|json|gif|eot|png|jpg|jpeg|ico|svg|xml|woff|woff2))$
  static_files: build/\1
  upload: build/.*\.(css|js|json|gif|eot|png|jpg|jpeg|ico|svg|xml|woff|woff2)$

# all other pages are a 404
- url: /.*
  script: build/404.php

The structure is the same as posted in the question, I just changed 404.html to 404.php.

Upvotes: 2

Related Questions