Nginx se ejecuta en el puerto 80, y lo estoy usando para revertir las URL de proxy con la ruta /foo
al puerto de 3200
esta manera:
location /foo {
proxy_pass http://localhost:3200;
proxy_redirect off;
proxy_set_header Host $host;
}
Esto funciona bien, pero tengo una aplicación en el puerto 3200
, para la cual no quiero /foo
que se envíe la inicial . Es decir, cuando accedo http://localhost/foo/bar
, solo quiero /bar
ser la ruta recibida por la aplicación. Así que intenté agregar esta línea al bloque de ubicación anterior:
rewrite ^(.*)foo(.*)$ http://localhost:3200/$2 permanent;
Esto provoca la redirección 302 (cambio en la URL), pero quiero 301. ¿Qué debo hacer?
nginx
reverse-proxy
301-redirect
jeffreyveon
fuente
fuente
Respuestas:
Cualquier redirección a localhost no tiene sentido desde un sistema remoto (por ejemplo, el navegador web del cliente). Por lo tanto, los indicadores de reescritura permanente (301) o redireccionamiento (302) no se pueden utilizar en su caso.
Intente la siguiente configuración con una regla de reescritura transparente:
Úselo
curl -i
para probar sus reescrituras. Un cambio muy sutil a la regla puede hacer que nginx realice una redirección.fuente
/foo(.*)
, de lo contrarioexample.com/foo
no se igualará. (que es probablemente lo que experimentó jeffreyveon)La coincidencia de prefijos de ubicación simple funciona para esto sin usar una regla de reescritura siempre que especifique un URI en la directiva proxy_pass:
Observe el adicional
/
al final de laproxy_pass
directiva. NGINX eliminará el prefijo coincidente/foo
y pasará el resto al servidor de fondo en el URI/
. Por lo tanto,http://myserver:80/foo/bar
publicaremos en el backend enhttp://localhost:3200/bar
.De los documentos de NGINX en proxy_pass :
fuente
//xyz
al host si haces eso.La forma más correcta y la mejor práctica suele ser la siguiente:
Tenga en cuenta la gran importancia de la barra diagonal final
proxy_pass
, que altera automáticamente la$uri
variable para que/foo/
el front-end se corresponda con/
el back-end. No hay necesidad de unarewrite
directiva explícita .Además, tenga en cuenta que el seguimiento
/
en el tambiénlocation
es bastante importante: sin él, corre el riesgo de tener URL de aspecto extraño en su sitio en un momento (por ejemplo, un trabajo/fooen
adicional/foo/en
).Además, el seguimiento
/
en ellocation
conproxy_pass
también garantiza un manejo especial , según la documentación de lalocation
directiva, para causar también un efecto implícitolocation = /foo {return 301 /foo/;}
.Por lo tanto, al definir a
location
con la barra inclinada final como se indicó anteriormente, no solo se asegura de que las URL de sufijo sin barra inclinada como/fooen
no sean válidas, sino que también funcionará una/foo
sin barra inclinada final.Documentación de referencia:
fuente
$args
están perdidos:http://frontend/foo?bar=baz
serán enviados por proxyhttp://backend/
. Tenga en cuenta que los argumentos no son parte de la URL$args
que aún debe manejarse de manera adecuada si usa el código anterior, ya que están separados$uri
y deben ensamblarse nuevamente, a menos que esté usando variables explícitas en suproxy_pass
./foo
redirigir a/foo/
, por lo tanto, a menos que esté haciendo algo extraño en el backend, incluso las/foo
solicitudes seguirán funcionando con el código anterior. (Esto en realidad ya es parte de la respuesta, por cierto)tratar
o
fuente
//xyz
al host si haces eso.@Terabuck Lo siento por no responder aún no hay representante.
No debe usar localhost porque depende del hecho de que la aplicación se ejecuta en un servidor con un archivo de hosts. El host local es solo una traducción predeterminada a 127.0.0.1. No hay nada que indique que debe tener estos archivos de host. Es muy común tener uno.
Tener una interfaz de bucle invertido es otra cosa común de la que depender, pero aún depende de la interfaz de bucle invertido en la pila de red. Es un caso raro no tener estos dos. Si alguna vez te preocupas por esto. Al menos en unix / linux tienes la opción de sockets. Esto eliminará la necesidad de que la pila de red llegue al host local. Tenga cuidado con este enfoque, ya que hay algunos factores que se aplicarán en el sistema operativo host. Como el número de archivos abiertos, etc.
fuente