¿Cómo puedo evitar que un usuario acceda a mi aplicación en example.appspot.com y obligarlo a acceder a ella en example.com? Ya tengo example.com funcionando, pero no quiero que los usuarios puedan acceder al dominio de appspot. Estoy usando python

14
Josh Patton 2 sep. 2009 a las 01:26

5 respuestas

La mejor respuesta

Puede verificar si os.environ['HTTP_HOST'].endswith('.appspot.com') - si es así, entonces está sirviendo desde something.appspot.com y puede enviar una redirección o alterar su comportamiento según lo desee.

Puede implementar esta comprobación y redireccionamiento si es necesario (u otra alteración de comportamiento de su elección) de cualquiera de varias maneras (decoradores, middleware WSGI, herencia de una clase base intermedia suya que subclases webapp.RequestHandler [[ o cualquier otra clase de controlador base que esté usando actualmente]] y nombres de métodos diferentes de get y post en sus clases de controlador de nivel de aplicación, y otros todavía), pero creo que la idea clave aquí es que os.environ está configurado por el marco del motor de la aplicación de acuerdo con los estándares de CGI, por lo que puede confiar en esos estándares (de manera similar, WSGI crea su propio entorno en función de los valores que recoge de os.environ).

17
Alex Martelli 1 sep. 2009 a las 22:02

En caso de que esté utilizando webapp2, es posible una solución un poco más fácil (dependiendo de su caso de uso) usando su DomainRoute.

Si este es su mapa de URL:

url_map = [
    ('/', HomeHandler),
    ('/about', AboutHandler),
    ('/admin/(.+)', AdminHandler),
    MailForwardHandler.mapping(),
]
application = webapp2.WSGIApplication(url_map, debug=True)

Y el administrador y el correo deberían no redirigir, luego agregar las rutas de redireccionamiento de la siguiente manera:

from webapp2_extras import routes

url_map = [
    routes.DomainRoute('appid.appspot.com', [
        routes.RedirectRoute('/', redirect_to='http://app.com', schemes=['http']),
        routes.RedirectRoute('/about', redirect_to='http://app.com/about', schemes=['http']),
    ],
    ('/', HomeHandler),
    ('/about', AboutHandler),
    ('/admin/(.+)', AdminHandler),
    MailForwardHandler.mapping(),
]
application = webapp2.WSGIApplication(url_map, debug=True)

Esto, como se especifica, solo redirigirá http, no https. Utiliza una redirección permanente (301), según lo deseado.

También puede pasar una función a redirect_to, como se describe en la documentación, lo que debería facilitarlo cuando tiene muchas reglas.

0
JW. 19 may. 2014 a las 17:25

Puede redirigirlo a su dominio personalizado (aquí example.com) anulando el método initialize en su clase base webapp2.RequestHandler de la siguiente manera:

def initialize(self, *a, **kw):
    webapp2.RequestHandler.initialize(self, *a, **kw)

    if self.request.host.endswith('appspot.com'):
        self.request.host = 'example.com'
        self.redirect(self.request.url, permanent=True)
1
lendenmc 15 jul. 2014 a las 13:03
def redirect_from_appspot(wsgi_app):
def redirect_if_needed(env, start_response):
    if env["HTTP_HOST"].startswith('my_app_name.appspot.com'):
        import webob, urlparse
        request = webob.Request(env)
        scheme, netloc, path, query, fragment = urlparse.urlsplit(request.url)
        url = urlparse.urlunsplit([scheme, 'www.my_domain.com', path, query, fragment])
        start_response('301 Moved Permanently', [('Location', url)])
        return ["301 Moved Peramanently",
              "Click Here" % url]
    else:
        return wsgi_app(env, start_response)
return redirect_if_needed  
3
Niklas R. 10 sep. 2009 a las 11:36

El código publicado anteriormente tiene dos problemas: trata de redirigir el tráfico seguro (que no es compatible con dominios personalizados), y también sus trabajos cron fallarán cuando Google los llame a su dominio de aplicacionespot y usted entregue un 301.

Publiqué una versión ligeramente modificada en mi blog: http: // blog .dantup.com / 2009/12 / redirecting-request-from-appid-appspot-com-to-a-custom-domain

He incluido el código a continuación para mayor comodidad.

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

def run_app(url_mapping):
    application = webapp.WSGIApplication(url_mapping, debug=True)
    application = redirect_from_appspot(application)
    run_wsgi_app(application)

def redirect_from_appspot(wsgi_app):
    """Handle redirect to my domain if called from appspot (and not SSL)"""
    from_server = "dantup-blog.appspot.com"
    to_server = "blog.dantup.com"

    def redirect_if_needed(env, start_response):

        # If we're calling on the appspot address, and we're not SSL (SSL only works on appspot)
        if env["HTTP_HOST"].endswith(from_server) and env["HTTPS"] == "off":

            # Parse the URL
            import webob, urlparse
            request = webob.Request(env)
            scheme, netloc, path, query, fragment = urlparse.urlsplit(request.url)
            url = urlparse.urlunsplit([scheme, to_server, path, query, fragment])

            # Exclude /admin calls, since they're used by Cron, TaskQueues and will fail if they return a redirect
            if not path.startswith('/admin'):
                # Send redirect
                start_response("301 Moved Permanently", [("Location", url)])
                return ["301 Moved Peramanently", "Click Here %s" % url]

        # Else, we return normally
        return wsgi_app(env, start_response)

    return redirect_if_needed
7
Danny Tuppeny 10 ene. 2010 a las 12:07