2010-07-27 33 views
0

这是我的app.yaml:网址与谷歌应用程序斜线引擎

- url: /about|/about/.* 
    script: about.py 

这是我的`about.py':

application = webapp.WSGIApplication([(r'^/about$', AboutPage), 
             (r'^/about/$', Redirect), 
             (r'.*', ErrorPage)], 
             debug = True) 

我想所有请求重定向到/about/​​。我希望将所有其他请求发送到错误页面。

它在localhost上的开发服务器上工作,但在GAE上部署应用程序后,我无法访问/about/ - 它只显示一个空白页面。

我调整了app.yaml中URL模式的顺序。 它现在适用于GAE。

+1

也许问题是重定向,而不是URL模式。 – cope360 2010-07-27 13:35:02

+0

什么重定向是 self.redirect('/ about') 它在我自己的机器上运行良好 – 2010-07-28 00:44:34

回答

6

如果您不希望在应用程序中的任何位置发生GET请求的尾部斜线,则可以在app.yaml的顶部实施全局重定向。请注意,POST请求不会重定向,但这是可以的(对我来说无论如何),因为用户通常不会手写POST URL。

的app.yaml

application: whatever 
version: 1 
api_version: 1 
runtime: python 

handlers: 
- url: .+/ 
    script: slashmurderer.py 

slashmurderer.py

from google.appengine.ext import webapp 
from google.appengine.ext.webapp.util import run_wsgi_app 

class SlashMurdererApp(webapp.RequestHandler): 
    def get(self, url): 
     self.redirect(url) 

application = webapp.WSGIApplication(
    [('(.*)/$', SlashMurdererApp)] 
) 

def main(): 
    run_wsgi_app(application) 
0

我的经验 - 看看你的URL是否在它的任何地方都有一个“//”(双斜杠)。如果它具有它,那么它在本地主机上工作,但它不适用于云。

+0

但是没有双斜线。 GAE日志显示空白页面是由404错误引起的。 – 2010-07-28 00:37:01

1

我看到,这个问题已经回答了,但我遇到了同样的问题,并希望看到如果有“懒惰”的解决方案。

如果你正在使用Python 2.7运行时,则webapp2的库是可用的,而且我相信下面的工作:

import webapp2 
from webapp2_extras.routes import Redirect Route 

class MainHandler(webapp2.RequestHandler): 
    def get(self): 
     self.response.out.write("This is my first StackOverflow post") 

app = webapp2.WSGIApplication([ 
    RedirectRoute('/', MainHandler, name='main', strict_slash=True), 
    ('/someurl', OtherHandler), 
]) 

strict_slash = True表示如果客户不提供斜杠它将被重定向到带有斜杠的url(以匹配第一个参数)。

您可以将webapp2_extras中的特殊Route类与普通(正则表达式,处理程序)元组结合使用,如上所示。 RedirectRoute的构造函数需要“name”参数。更多细节在这里:webapp2_extras documentation for RedirectRoute