85

I have some subdomains I want to redirect to specific ports on the same server. Say I have

dev.mydomain.com 

I want dev.mydomain.com to transparently redirect to mydomain.com:8080 and I want to preserve the original sub-domain name the url of the browser.

How do I do this with Apache 2.2? I have Apache 2.2 running on default port 80. I can't figure out the write configuration to get this to happen.

I have already set up dev.mydomain.com to resolve in DNS to mydomain.com.

This is for an intranet development server that has a non-routable ip address so I am not so concerned about exploits and security that would compromise a publicly facing server.

5 Answers5

84

Solution

Here is what I finally came up with after being set in the right direction by Miles Erickson. I wanted the address bar to reflect the original subdomain/domain of the request and not the redirected server and port, but he put me on the right path to Google up a solution using VirtualHost and I finally found a solution that included the use of mod_proxy.

First, make sure mod_proxy is enabled:

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod lbmethod_byrequests
sudo systemctl restart apache2

Next, add the following to your site config (e.g., /etc/apache2/sites-available/000-default.conf):

<VirtualHost *:80>
    ServerAdmin me@mydomain.com
    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>
Tahlor
  • 103
  • 1
  • 1
  • 3
  • 9
    For everyone who this answer didn't work for, keep in mind that you have to enable mods `mod_proxy` as well as `proxy_http`. – matewka Nov 20 '15 at 19:47
  • What about in `nginx` ? – rosefun Dec 01 '20 at 14:41
  • For macOSX, don't waste hours like me trying to edit `/etc/apache2/extra/httpd-vhosts.conf`. My `httpd.conf`wasn't looking at this vhosts file by default. I had to add my new conf to `/private/etc/apache2/other` ([ref](https://jasonmccreary.me/articles/configure-apache-virtualhost-mac-os-x/)). Everything else above worked as is. – NP01 Jul 05 '21 at 00:07
16

Run the following line on terminal (specify your domain and sub domain name correctly)

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

Paste the following code and change as your requirement

<VirtualHost *:80>
        ServerAdmin admin@example.com
        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>

Run the following lines on terminal (specify your domain and sub domain name correctly)

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2ensite subdomain.example.com.conf
sudo service apache2 restart
M.A.K. Ripon
  • 271
  • 3
  • 8
  • 5
    Is there any essential difference between this and the accepted answer? – kasperd Jan 18 '16 at 10:13
  • 1
    Most of the people forget to add `sudo a2enmod proxy_http` so they face difficulties on running properly. Also I try to give full process from start to end in a sequence to help more acculturate. Thanks for your question. – M.A.K. Ripon Jan 18 '16 at 10:34
  • Thanks kasperd for asking it's just a little bit tweaking for people like me who forget some little things which are essential like sudo a2enmod proxy and sudo a2enmod proxy_http command after creating the configuration file. – M.A.K. Ripon Feb 07 '17 at 09:07
  • 1
    This just does not work for me. 'sudo a2enmod subdomain.domain.com.conf' says "ERROR: Module x.y.z does not exist!" Does it have to be mentioned in the 'default' configuration? – Dirk Schumacher Apr 17 '17 at 09:17
  • @dirk-schumacher can you please give your configuration file details here so that we can identify the exact error cause. – M.A.K. Ripon Apr 18 '17 at 07:07
  • 2
    Correction in registering subdomain `sudo a2ensite sub.yourdomain.com` – Ali Azhar Aug 01 '17 at 19:53
11

Assuming that dev.mydomain.com can be resolved to mydomain.com's IP, you could add the following to your httpd.conf:

NameVirtualHost *:80

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

Relevant Apache documentation:

  1. Guide to creating name-based virtual hosts
  2. Core, including VirtualHost and NameVirtualHost
  3. Redirect

Related question: Apache redirect based on hostname

(Note: the original version of this answer incorrectly suggested the use of RedirectMatch, which, as @ChrisS helpfully pointed out, cannot parse the domain portion of the URL.)

Skyhawk
  • 14,149
  • 3
  • 52
  • 95
  • 1
    see my self provided answer for what I actually used, which is this idea of VirtualHost with mod_proxy to preserve the original host instead of doing a redirect. This is an internal server so I am not concerned with security or exploits of mod_proxy. –  Oct 28 '10 at 15:38
  • 1
    Found numerous other suggestions but this ultimately worked for me on Windows Server 2008 R2/Apache 2.2.25. – HPWD Jul 12 '15 at 20:07
  • 1
    The problem with this solution is that in your brother, you don't stay on the first domain, you get a 302 to the second. – Pleymor Feb 09 '17 at 12:20
5

Add in your main vhost configuration the following lines:

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

Note that this requires mod_proxy on Apache.

Eino Gourdin
  • 103
  • 1
  • 5
  • This is not a redirect; it proxies the connection. Enabling mod_proxy can be extremely easy to exploit if you aren't very careful configuring it. I would highly recommend against this. – Chris S Oct 28 '10 at 12:38
  • 4
    He doesn't want a redirect, as per his OP. He wants the original URL to remain in the address bar; this means using either mod_proxy or mod_rewrite, and y'all better avoid mod_rewrite. – adaptr Mar 01 '12 at 14:40
4

You're looking for mod_rewrite. Here's the link to Apache's documentation which includes many examples for basic and advanced configurations..

And if you're unable to interpret the documentation yourself, try adding this to httpd.conf:

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

And if that's not a clear example, here's a link to a mod_rewrite beginners guide too.

sage
  • 103
  • 4
Chris S
  • 77,337
  • 11
  • 120
  • 212
  • 1
    I'm on shared hosting. Rewrite is the only option. I can create a .htaccess file, but not a proxy or virtual host. – abalter Feb 15 '18 at 17:18