Отключите чувствительные к регистру URL в Google App Engine - PullRequest
2 голосов
/ 15 сентября 2009

Мы недавно перевели веб-сайт нашей компании в движок приложений Google. Мы столкнулись с проблемами чувствительности к регистру с некоторыми ссылками на нашем сайте. Некоторые ссылки в верхнем регистре, когда соответствующие папки на сервере в нижнем регистре. Это не было проблемой на нашем старом сервере Windows. Механизм приложений Google, похоже, чувствителен к регистру URL-адресов. Это вызывает неработающие ссылки.

Кто-нибудь знает, есть ли способ заставить наши URL работать без учета регистра в движке приложений Google?

Ответы [ 2 ]

7 голосов
/ 16 сентября 2009

Это для статических файлов или динамических обработчиков? для динамических обработчиков вы можете легко написать часть промежуточного программного обеспечения 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()

Редактировать: Добавлено решение для статических файлов.

0 голосов
/ 15 сентября 2009

Я не знаю встроенного способа.

Все, что я могу подумать, это то, что вам нужно создать обработчик для /(.*), а затем написать некоторый код для пересылки оттуда запросов правильным обработчикам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...