Это для статических файлов или динамических обработчиков? для динамических обработчиков вы можете легко написать часть промежуточного программного обеспечения WSGI, которое в нижнем регистре содержит все URI:
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)
Обратите внимание, что это не «ошибка» в App Engine - URL-адреса чувствительны к регистру, и единственная причина, по которой все работает, заключается в том, что Windows в отличие от большинства других платформ игнорирует регистр.
Для статических файлов добавьте статический обработчик, который принимает только имена файлов в нижнем регистре, и динамический обработчик, который принимает имена файлов в любом случае:
handlers:
- url: /static/([^A-Z]+)
static_files: static/\1
upload: static/.*
- url: /static/.*
handler: tolowercase.py
Теперь напишите 'tolowercase.py', обработчик, который перенаправляет любое смешанное имя файла в версию в нижнем регистре:
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()
Редактировать: Добавлено решение для статических файлов.