Is this for static files or dynamic handlers? for dynamic handlers, you can easily write a piece of WSGI middleware that lower-cases all URIs:
def lower_case_middleware(environ, start_response):
environ['SCRIPT_NAME'] = environ['SCRIPT_NAME'].lower()
environ['PATH_INFO'] = environ['PATH_INFO'].lower()
return application(environ, start_response)
Note that this isn't a 'bug' in App Engine - URLs are case sensitive, and the only reason things did work is because Windows, unlike most other platforms, ignores case.
For static files, add a static handler that only accepts lower case filenames, and a dynamic handler that accepts filenames of either case:
handlers:
- url: /static/([^A-Z]+)
static_files: static/\1
upload: static/.*
- url: /static/.*
handler: tolowercase.py
Now write 'tolowercase.py', a handler that redirects any mixed case filename to the lower-cased version:
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
class LowerCaseRedirecter(webapp.RequestHandler):
def get(self, path):
self.redirect('/static/%s' % (path.lower(),))
application = webapp.WSGIApplication([('/static/(.*)', LowerCaseRedirecter)])
def main():
run_wsgi_app(application)
if __name__ == "__main__":
main()
Edit: Added a solution for static files.