2009-06-29 9 views
16

Comment configurer le fichier app.yaml pour rediriger toutes les URL vers une autre URL? Par exemple je veux http://test.appspot.com/hello ou http://test.appspot.com/hello28928723 pour rediriger vers http://domain.com. Je ne suis au service que des fichiers statiques pour le moment. Voici mon fichier app.yaml:Comment rediriger toutes les URL avec Google App Engine

application: testapp 
version: 1 
runtime: python 
api_version: 1 

handlers: 
- url: (.*)/ 
    static_files: static\1/index.html 
    upload: static/index.html 

- url:/
    static_dir: static 

Répondre

7

Vous pouvez rediriger toutes les demandes facilement avec un gestionnaire python. Quelque chose comme

class FormHandler(webapp.RequestHandler): 
    def post(self): 
    if processFormData(self.request): 
     self.redirect("http://domain.com") 
+7

Cette réponse est incomplète - ce fragment de code est insuffisant en soi pour rediriger reqeusts. Aussi, qu'en est-il des demandes? –

+1

@BrianLeathem Juste posté un [exemple complet] (http://stackoverflow.com/a/18297787/282729). – feklee

33

webapp2 a un redirect intégré gestionnaire

Pas besoin de rouler votre propre gestionnaire; webapp2 vient déjà avec un.

application = webapp2.WSGIApplication([ 
    webapp2.Route('/hello', webapp2.RedirectHandler, defaults={'_uri':'http://domain.com'}), 
    webapp2.Route('/hello28928723', webapp2.RedirectHandler, defaults={'_uri':'http://domain.com'}), 
], debug=False) 

L'argument _uri est ce que la classe RedirectHandler utilise pour définir la destination. Il a fallu beaucoup de Google Fu pour trouver la documentation à ce sujet, mais cela fonctionne parfaitement dans mon application.

Mise à jour:

Je suppose que vous êtes au courant de cela, mais vous avez besoin de changer votre fourre-tout itinéraire à partir de:

- url:/
    static_dir: static 

Pour (version python27):

- url: /.* 
    script: main.application 

Ou: (version pré-python27)

- url: /.* 
    script: main.py 

main.py est le fichier contenant le gestionnaire de requêtes + routes.

Remarque: Il n'existe pas de méthode statique uniquement pour gérer les redirections sur GAE en raison de la nature des fichiers statiques. Fondamentalement, il n'y a aucun moyen de faire une redirection dans app.yaml seul.

+1

Cela gère get/post/etc ... C'est fondamentalement la façon «correcte» de faire une redirection 301 (permanente) dans GAE. –

+0

Il est important de noter qu'app Engine ne prend pas en charge la redirection vers des fichiers/répertoires statiques. Je ne pouvais pas obtenir la redirection au travail. J'ai continué à obtenir ces erreurs dans mes journaux: "Fichier référencé par le gestionnaire non trouvé: main.app". Enfin, j'ai trouvé ceci, qui a confirmé que les fichiers statiques ne sont pas accessibles aux gestionnaires: http://stackoverflow.com/questions/8734040/google-app-engine-static-pages-python-2-5-directories-etc. –

+0

@StephenKaiser Techniquement, ce n'est pas une redirection mais vous pouvez définir une nouvelle route dans app.yaml qui pointe de l'ancien URI vers le nouveau. En raison de l'architecture et du traitement des fichiers statiques, il est impossible de définir une redirection 301/302 réelle sur les fichiers statiques. –

2

Voici un script python qui fera le redirect:

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

class MainPage(webapp.RequestHandler): 
    def get(self, path): 
    self.redirect("http://example.com", permanent=True) 
    def head(self, path): 
    self.redirect("http://example.com", permanent=True) 

application = webapp.WSGIApplication(
      [ 
       (r'^(.*)', MainPage) 
      ]) 

def main(): 
    run_wsgi_app(application) 

if __name__ == "__main__": 
    main() 
+0

Notez que la réponse webapp2 fournie par @Evan Plaice fonctionne, mais j'ai été bloqué avec l'ancienne banque de données et je n'ai pas pu utiliser python 2.7. –

+0

+1 pour l'affichage d'une solution rétrocompatible avec webapp. –

7

Tout ce que vous avez besoin (remplacer app-id, http://example.com):

  • app.yaml:

    application: app-id 
    version: 1 
    runtime: python27 
    api_version: 1 
    threadsafe: false 
    
    handlers: 
    - url: /.* 
        script: main.py 
    
  • main.py:

    from google.appengine.ext import webapp 
    from google.appengine.ext.webapp.util import run_wsgi_app 
    
    class AllHandler(webapp.RequestHandler): 
        def get(self): 
         self.redirect("http://example.com", True) 
    
    application = webapp.WSGIApplication([('/.*', AllHandler)]) 
    
    def main(): 
        run_wsgi_app(application) 
    
    if __name__ == "__main__": 
        main() 
    
+0

suggère d'ajouter "secure: optional" au gestionnaire app.yaml afin que https fonctionne également. –

+0

"sécurisé: facultatif" est la valeur par défaut lorsqu'il n'est pas fourni (https://cloud.google.com/appengine/docs/python/config/appconfig#Python_app_yaml_Secure_URLs) – qix

1

Si vous voulez un fichier-électricité statique que façon de le faire "réexpédie" faites ceci:

Dans l'application.YAML, mis cela comme le fourre-tout, à la fin du fichier:

- url: /.* 
    static_files: root/redirect.html 
    upload: root/redirect.html 

Puis dans le fichier racine/redirect.html, mettez ceci:

<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="refresh" content="0;URL=/" /> 
     <script> 
      location.replace("/"); 
     </script> 
    </head> 
    <body></body> 
</html> 

Cet exemple redirigera tous inconnus URL à la racine (par exemple, /). Si vous voulez une autre URL, substituez simplement http://mydomain.com aux endroits appropriés.

0

Riffing au large de la réponse de Evan, de rediriger toutes les requêtes que vous pouvez utiliser regexes faire quelque chose comme:

import webapp2 
from webapp2_extras.routes import RedirectRoute 

app = webapp2.WSGIApplication([ 
    RedirectRoute('/<:.*>', redirect_to='/') 
    ], debug=False) 

Pour vérifier documentation officielle sur:

https://webapp-improved.appspot.com/api/webapp2_extras/routes.html

https://webapp-improved.appspot.com/api/webapp2.html#webapp2.Route.init

0

Le gestionnaire de redirection pour webapp2 (webapp2.RedirectHandler) mentionné dans une réponse précédente ne fonctionnera pas pour les demandes de publication , car il ne contient pas de méthode de publication (voir https://github.com/GoogleCloudPlatform/webapp2/blob/master/webapp2.py), vous devrez donc utiliser votre propre gestionnaire python si vous êtes concerné par des publications. Quelque chose comme le suivant:

import webapp2 

class MainPage(webapp2.RequestHandler): 


    def post(self): 
     self.redirect('http://example.com') 


application = webapp2.WSGIApplication([ 
('/.*', MainPage) 
], debug=False) 
Questions connexes