2012-02-07 22 views
6

Esta es una pregunta muy simple: ¿Cómo ejecuto una aplicación Yesod que puede manejar varios hosts al mismo tiempo?Aplicación Yesod independiente del nombre de host

Una configuración predeterminada de Yesod puede manejar las conexiones entrantes desde cualquier host, pero todas las URL se procesan con approot antes de ellas. Anular joinPath en la declaración de la instancia Yesod sería posible, si hubiera una forma de almacenar el dominio actual para que esté disponible para esa función, pero no lo hay.

El método descrito en this wiki page funciona, pero es muy hackish, ya que obliga a las rutas a tomar un parámetro domain adicional (ya que no tengo un conjunto estático de dominios para hacer coincidir). Para fines prácticos (porque tengo muchas rutas, algunas de las cuales son independientes del dominio), sería mejor tener una solución que dejara intactas las rutas, ya que es posible obtener el nombre de host de la información de solicitud de WAI dentro de una función de controlador.

Uso cosas que requieren URL absolutas (por ejemplo, correo electrónico, RSS, XML API) así que approot _ = "" no es una opción.

No conozco ni puedo conocer todos los nombres de host, que deben ser compatibles, en tiempo de compilación.

Entonces, ¿cómo renderizo las URL para que utilicen el nombre de host de la solicitud entrante y no la variable approot?

Respuesta

3

Un enfoque sería incluir el nombre de dominio real en el tipo de fundación, y usar un middleware que explota la aplicación apropiada dependiendo de la Solicitud, generando nuevas según sea necesario. Sin embargo, esto parece demasiado pesado.

Quiero dejarlo como está, ya que se ajusta al caso general, pero quizás podamos agregar un método adicional approotRequest que también tenga el valor Request. Me gustaría mover esta discusión a la lista.

actualización: Cambio ya aterrizó en Git: https://github.com/yesodweb/yesod/commit/4dd9880389e3b61f976e44525ae97831ec578a17

+0

que van a seguir la discusión, y agradecería una actualización de esta respuesta (por otros usuarios) una vez a la solución está en los repositorios. ¡Gracias! – dflemstr

Cuestiones relacionadas