2012-03-19 8 views
8

Tengo una aplicación Python Flask ejecutándose en Heroku (pila Cedar) con dos dominios personalizados (uno con y sin el subdominio www). Me gustaría redirigir todas las solicitudes entrantes a www. versión del recurso solicitado (el inverso de this question). Creo que necesito un middleware WSGI para esto, pero no puedo encontrar un buen ejemplo.¿Cómo puedo redirigir a www. versión de mi sitio Flask en Heroku?

¿Cómo puedo hacer esto?

+0

Para aclarar, tiene 'example1.com',' example2.com' y 'www.example2.com'. Desea que todas las solicitudes a 'example1.com' y' example2.com' se redirijan a 'www.example2.com'. ¿Es eso correcto? –

+0

solo example.com y www.example.com con example.com/ redirigiendo a www.example.com/

+0

¿No podría hacer esto con DNS? ¿Por qué quieres hacer eso en la capa de aplicación? –

Respuesta

12

Una solución más fácil que crear una aplicación Heroku por separado sería una función before_request.

from urlparse import urlparse, urlunparse 

@app.before_request 
def redirect_nonwww(): 
    """Redirect non-www requests to www.""" 
    urlparts = urlparse(request.url) 
    if urlparts.netloc == 'example.com': 
     urlparts_list = list(urlparts) 
     urlparts_list[1] = 'www.example.com' 
     return redirect(urlunparse(urlparts_list), code=301) 

Esto redireccionará todas las solicitudes que no sean www a www utilizando una respuesta "HTTP 301 movido permanentemente".

+1

Hice algo similar, pero en lugar de reemplazar un índice, puede usar 'urlparts = urlparts._replace (netloc = 'www.example.com')' y 'urlunparse (urlparts)' –

1

Un posible enfoque sería agregar una función para escuchar en request_started, y hacer la redirección apropiada.

Esta señal se envía antes de que se inicie cualquier solicitud de proceso pero cuando se configuró el contexto de solicitud . Debido a que el contexto de solicitud ya está vinculado a , el suscriptor puede acceder a la solicitud con los proxies globales estándar , como la solicitud.

+0

parece prometedor.no estoy seguro de cómo iba a emitir una respuesta desde allí, pero investigando. –

+0

Inicialmente pensé que tendrías que jugar con werkzeug pero no es tan directo como el enganche del matraz. Si las señales no funcionan, siempre puedes probar algo en [werkzeug middleware] (http://werkzeug.pocoo.org/docs/middlewares/). –

3

Según Heroku Docs, tiene la idea correcta sobre el uso del subdominio www (por ejemplo, www.foo.com) frente al dominio apex (por ejemplo, foo.com). Su sugerencia para hacer frente a esto es utilizar una redirección capa de DNS:

Para citar:

subdominio de redirección

resultados subdominio del cambio de dirección en un 301 permanent redirect a la subdominio especificado para todas las solicitudes hasta el ápice dominio para que todas las solicitudes actuales y futuras se enruten correctamente y se muestre el nombre de host www completo en el campo de ubicación del usuario.

Casi todos los proveedores de DNS ofrecen servicios de redireccionamiento de dominio, a veces también llamado reenvío de dominio. DNSimple proporciona una URL conveniente redirigir visto aquí redirigiendo desde heroku-sslendpoint.com apex dominio al subdominio www.heroku-sslendpoint.com.

Fuente: http://devcenter.heroku.com/articles/avoiding-apex-domains-dns-arecords#subdomain_redirection

Espero que ayude!

+0

El problema con las soluciones basadas en DNS es que no conservan la ruta. Entonces esto no funcionó para mí. –

0

Lo que terminé haciendo fue crear una segunda aplicación Heroku, asignando el nombre de host que no sea www a esa y usando una ruta catch all Flask para redirigir a la versión www manteniendo la ruta intacta.

Cuestiones relacionadas