61

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.

66

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.

<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>
  • 7
    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
10

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.)

  • 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. – Jarrod Roberson 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 9 '17 at 12:20
6

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.

  • 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 1 '12 at 14:40
3

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.

  • 3
    It isn't correct. mod_rewrite should only be used as a last resort, when nothing else will do. The redirect and proxy solutions given are far superior in this (and almost any other conceivable) case. – adaptr Mar 1 '12 at 14:38
  • 2
    @adaptr This does a redirect, I fail to see how any of the other redirects are "far superior". And suggesting that he setup a proxy when he clearly doesn't have a firm grasp of Apache/Security/Performance/etc, is that serious? – Chris S Mar 1 '12 at 15:28
  • 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
3

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
  • 3
    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
  • 1
    +1 because of mentioning "ProxyRequests Off" – Sebastian Feb 7 '17 at 8:27
  • 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 9:17
  • 2
    Correction in registering subdomain sudo a2ensite sub.yourdomain.com – Ali Azhar Aug 1 '17 at 19:53

protected by Community Nov 19 '18 at 16:09

Thank you for your interest in this question. Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).

Would you like to answer one of these unanswered questions instead?

Not the answer you're looking for? Browse other questions tagged or ask your own question.