在Google App Engine中关闭区分大小写的URL

时间:2009-09-15 17:04:31

标签: google-app-engine

我们最近将公司网站移至Google应用引擎。我们在网站上遇到了部分链接的区分大小写问题。当服务器上的相应文件夹为小写时,某些链接为大写。这不是我们旧的Windows服务器上的问题。 Google应用引擎似乎与网址区分大小写。这导致链接断开。

是否有人知道是否有办法让我们的网址在Google应用引擎上不受影响?

3 个答案:

答案 0 :(得分:7)

这适用于静态文件还是动态处理程序?对于动态处理程序,您可以轻松编写一个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()

编辑:添加了静态文件的解决方案。

答案 1 :(得分:0)

我不知道内置的方式。

我只能想到你需要为/(.*)创建一个处理程序,然后编写一些代码来将请求转发给正确的处理程序。

答案 2 :(得分:0)

使用这里的一些示例,这是我处理大写网址的方式。

import webapp2

   class ToLowerHandler(webapp2.RequestHandler):
    def get(self):
       self.redirect(self.request.url.lower())

app = webapp2.WSGIApplication([
    ('/.*', ToLowerHandler)  
], debug=True)

def main():
    application.run()

if __name__ == "__main__":
    main()