¿Cómo redirijo los subdominios a un puerto diferente en el mismo servidor?

67

Tengo algunos subdominios que quiero redirigir a puertos específicos en el mismo servidor. Di que tengo

dev.mydomain.com 

Quiero dev.mydomain.comredirigir de forma transparente mydomain.com:8080y quiero preservar el nombre del subdominio original de la url del navegador.

¿Cómo hago esto con Apache 2.2? Tengo Apache 2.2 ejecutándose en el puerto predeterminado 80. No puedo entender la configuración de escritura para que esto suceda.

Ya he configurado dev.mydomain.compara resolver en DNS para mydomain.com.

Esto es para un servidor de desarrollo de intranet que tiene una dirección IP no enrutable, por lo que no estoy tan preocupado por las vulnerabilidades y la seguridad que comprometerían a un servidor público.


fuente

Respuestas:

69

Solución

Esto es lo que finalmente se me ocurrió después de que Miles Erickson me haya orientado en la dirección correcta. Quería que la barra de direcciones reflejara el subdominio / dominio original de la solicitud y no el servidor y el puerto redirigidos, pero él me puso en el camino correcto para buscar una solución en Google VirtualHosty finalmente encontré una solución que incluía el uso de mod_proxy.

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName dev.mydomain.com
    ProxyPreserveHost On

    # setup the proxy
    <Proxy *>
        Order allow,deny
        Allow from all
    </Proxy>
    ProxyPass / http://localhost:8888/
    ProxyPassReverse / http://localhost:8888/
</VirtualHost>
usuario3037143
fuente
77
Para todos los que esta respuesta no trabajo para, tener en cuenta que usted tiene que permitir modificaciones mod_proxyasí como proxy_http.
matewka
9

Suponiendo que dev.mydomain.com se pueda resolver a la IP de mydomain.com, puede agregar lo siguiente a su httpd.conf:

NameVirtualHost *:80

<VirtualHost *:80>
    ServerName dev.mydomain.com
    redirect / http://mydomain.com:8080/
</VirtualHost>

Documentación relevante de Apache:

  1. Guía para crear hosts virtuales basados ​​en nombres
  2. Core , que incluye VirtualHost y NameVirtualHost
  3. Redirigir

Pregunta relacionada: redirección de Apache basada en el nombre de host

(Nota: la versión original de esta respuesta sugirió incorrectamente el uso de RedirectMatch, que, como @ChrisS señaló útilmente, no puede analizar la porción de dominio de la URL).

Skyhawk
fuente
1
vea mi respuesta propia para lo que realmente usé, que es esta idea de VirtualHost con mod_proxy para preservar el host original en lugar de hacer una redirección. Este es un servidor interno, por lo que no estoy preocupado por la seguridad o las vulnerabilidades de mod_proxy.
1
Encontré muchas otras sugerencias, pero finalmente funcionó para mí en Windows Server 2008 R2 / Apache 2.2.25.
HPWD
1
El problema con esta solución es que en tu hermano, no te quedas en el primer dominio, obtienes un 302 para el segundo.
Pleymor
7

Ejecute la siguiente línea en la terminal (especifique su nombre de dominio y subdominio correctamente)

sudo nano /etc/apache2/sites-available/subdomain.example.com.conf 

Pegue el siguiente código y cámbielo como su requisito

<VirtualHost *:80>
        ServerAdmin [email protected]
        ServerName subdomain.example.com
        ServerAlias subdomain.example.com
        ProxyRequests Off

        #ProxyPass / http://localhost:8080/
        <Location />
                ProxyPreserveHost On
                ProxyPass http://example.com:8080/
                ProxyPassReverse http://example.com:8080/
        </Location>
     # Uncomment the line below if your site uses SSL.
     #SSLProxyEngine On
</VirtualHost>

Ejecute las siguientes líneas en la terminal (especifique su nombre de dominio y subdominio correctamente)

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2ensite subdomain.example.com.conf
sudo service apache2 restart
MAK Ripon
fuente
3
¿Hay alguna diferencia esencial entre esto y la respuesta aceptada?
kasperd
1
La mayoría de las personas se olvidan de agregar, sudo a2enmod proxy_httppor lo que enfrentan dificultades para funcionar correctamente. También trato de dar un proceso completo de principio a fin en una secuencia para ayudar a más aculturación. Gracias por tu pregunta
MAK Ripon el
1
+1 por mencionar "ProxyRequests Off"
Sebastian
1
Esto simplemente no funciona para mí. 'sudo a2enmod subdominio.domain.com.conf' dice "ERROR: ¡El módulo xyz no existe!" ¿Tiene que mencionarse en la configuración 'predeterminada'?
Dirk Schumacher
2
Corrección en el registro del subdominio sudo a2ensite sub.yourdomain.com
Ali Azhar
5

Agregue en su configuración principal de vhost las siguientes líneas:

ProxyPreserveHost On
ProxyPass / http://example.com:8080/
ProxyPassReverse / http://example:8080/

Tenga en cuenta que esto requiere mod_proxy en Apache.

Ryszard Stawiarski
fuente
Esto no es una redirección; Proxies la conexión. Habilitar mod_proxy puede ser extremadamente fácil de explotar si no tiene mucho cuidado al configurarlo. Lo recomendaría contra esto.
Chris S
44
Él no quiere una redirección, según su OP. Quiere que la URL original permanezca en la barra de direcciones; esto significa usar mod_proxy o mod_rewrite, y es mejor evitar mod_rewrite.
Adaptr
4

Estás buscando mod_rewrite. Aquí está el enlace a la documentación de Apache que incluye muchos ejemplos de configuraciones básicas y avanzadas .

Y si no puede interpretar la documentación usted mismo, intente agregar esto a httpd.conf:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^dev\.example\.com$ [NC]        
RewriteRule ^(.*)$ http://example.com:8080$1 [R=301]    

Y si ese no es un ejemplo claro, aquí hay un enlace a una guía para principiantes mod_rewrite también.

Chris S
fuente
1
Estoy en alojamiento compartido. Reescribir es la única opción. Puedo crear un archivo .htaccess, pero no un proxy o host virtual.
abalter