Tengo una aplicación web en ejecución en http://example.com/
, y quiero "montar" otra aplicación, en un servidor separado http://example.com/en
. Servidores ascendentes y proxy_pass
parecen funcionar, pero por un problema:
upstream luscious {
server lixxxx.members.linode.com:9001;
}
server {
root /var/www/example.com/current/public/;
server_name example.com;
location /en {
proxy_pass http://luscious;
}
}
Al abrir example.com/en
, vuelve mi aplicación aguas arriba 404 not found /en
. Esto tiene sentido, ya que el río arriba no tiene el camino /en
.
¿Es proxy_path
la solución correcta? ¿Debo reescribir "aguas arriba" para que escuche en su /en
lugar, como ruta raíz? ¿O hay una directiva que me permite reescribir la ruta que se pasa a la parte superior?
proxy_pass
es lo que marca la diferencia. Además, esta respuesta es más correcta que la que se le ocurrió, ya que también garantiza queproxy_redirect
permanezcadefault
así, por lo que aún puede usar302
et al en su back-end y hacer que funcione correctamente en todas partes.Me gustaría abordar una nueva respuesta basada en expresiones regulares que ha ido aumentando en popularidad.
La solución puede parecer más linda a primera vista, pero está mal por varias razones.
La expresión regular anterior coincidiría con una solicitud uri de
/enjoy
, redirigiéndola a/joy
upstream. ¿Es esto realmente intencionado?Una solicitud de
/en
no dará lugar a ninguna redirección, y servirá directamente a un servidor/
ascendente (casi como si se hubiera realizado una solicitud/en/
, pero no del todo). Si usa URI relativos dentro de su página raíz en sentido ascendente (de lo contrario, ¿por qué no tendría el/en/
prefijo allí dentro de los URI en sentido ascendente?), Por ejemplosrc="style.css"
(que podría hacer referencia a un idioma específicourl("menu.png")
, por ejemplo), entonces el navegador solicitará que como/style.css
lugar de/en/style.css
. (O incluso si usa URI absolutos en todas partes, ¿qué pasa si alguien hace referencia a un recurso semi-opcional oscuro relativamente?) Vaya, de repente el sitio puede no funcionar, pero solo a veces o en casos extremos.Según mi consejo anterior en otra pregunta ya mencionada por la propia respuesta del OP , el uso de expresiones regulares evita que la
proxy_redirect
directiva tenga el valor predeterminado dedefault
, convirtiéndola en suoff
lugar. Esto significa que si el upstream respondeLocation: http://127.0.0.1:8080/en/dir/
cuando se realiza una solicitud/en/dir
, entonces eso es lo que verá el cliente, que obviamente no funcionará correctamente. (Lo que habría sido especialmente irónico para una/en
solicitud que solicita el uso de expresiones regulares en primer lugar, sin embargo, esta implementación específica sufre otro problema como ya se mencionó anteriormente). Además, si ya está utilizando elupstream
directiva, entonces podría volverse más feo si solo trata de elegir uno personalizado, especialmente si puede tener más de un servidor en sentido ascendente. ¿Cómo tiene un servidor separadoproxy_redirect
para cada uno de ellos? También podría usar expresiones regulares dentroproxy_redirect
, tal vez incluso para que coincida con cualquier host, pero ¿y si decide dar una redirección de dominio cruzado en el futuro?Para tratar de abordar algunos de los puntos anteriores con una única ubicación basada en expresiones regulares, podríamos hacer lo siguiente (tenga en cuenta que
proxy_pass
también tuvimos que eliminar la referencia a un servidor desde unaupstream
directiva basada en, para hacerproxy_redirect
más sencillo):Entonces, si me preguntas, la solución original con las dos ubicaciones de nivel superior para hermanos aún sería una mejor idea que cavarte en una madriguera de conejos siguiendo la ruta de expresiones regulares.
fuente
nginx: [emerg] location "/en" is outside location "^/en/?((?<=/).*
Entonces, encontré la respuesta en stackoverflow :
Básicamente: pasar una expresión regular a la ubicación y pasar la referencia a la URL proxy_pass.
fuente
Contabilidad para documentos Nginx
Para pasar una solicitud a un servidor proxy HTTP, la directiva proxy_pass se especifica dentro de una ubicación. Por ejemplo:
Este ejemplo de configuración hace que todas las solicitudes procesadas en esta ubicación pasen al servidor proxy en la dirección especificada. Esta dirección se puede especificar como un nombre de dominio o una dirección IP. La dirección también puede incluir un puerto:
Tenga en cuenta que en el primer ejemplo anterior, la dirección del servidor proxy va seguida de un URI, / link /. Si el URI se especifica junto con la dirección, reemplaza la parte del URI de solicitud que coincide con el parámetro de ubicación. Por ejemplo, aquí la solicitud con el /some/path/page.html URI se enviará a http://www.example.com/link/page.html . Si la dirección se especifica sin un URI, o no es posible determinar la parte del URI que se va a reemplazar, se pasa el URI de solicitud completo (posiblemente, modificado).
fuente