Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to rewrite / proxy an Apache URI to an application listening on a specific port / server?

They say that Apache's mod_rewrite is the swiss-army knife of URL manipulation, but can it do this?

Lets say I want to add a new application to my Apache webserver, where the only configurable option of the app is a port number.

I want to use & give out URLs of the form "http://hostname.example.com/app" rather than "http://hostname.example.com:8080". This would ensure that clients would be getting through the institution's firewall as well, and it's generally tidier.

My application includes absolute URIs in php, javascript and css, so I want to prepend my own root location to the URI in the applications internal links. I have no access to DNS records and so can't create another name-based virtual server.

Using Apache's mod_rewrite and mod_proxy modules, I can transparently redirect a client to the correct home-page of the application. But links within that homepage don't point a client to links relative to the new base URL.

So, what's the best way of proxying a request to an application that is listening on a specific port?

For example, if I had an application listening on port 8080, I could put this in my Apache configuration:-

<VirtualHost *:80>
    SSLProxyEngine On
    ServerName myhost.example.com
    RewriteEngine On
    UseCanonicalName On
    ProxyVia On
    <Location "/application">
        RewriteRule ^/application/?(.*) http://localhost:8080/$1 [P,L]
    </Location>
</VirtualHost>

This would work fine if the application didn't use absolute URLs, but it does. What I need to do is rewrite URLs that are returned by the application's css, javascript and php.

I've looked at the ProxyPass and ReverseProxyPass documentation, but I don't think these would work..?

I've also come across Nick Kew's mod_proxy_html, but this isn't included in the standard Apache Distribution, and my institution's webserver seems to have been fine for years without it.. Other than trawling manually (or using a grep -r | sed type expression) through the application's source code, or using this 3rd party add-on, are there any other ways to go about this?

Could I perhaps use some of the internal server variables in a mod_rewrite rule? For example a rewrite rule based on ’HTTP_REFERER'?

like image 443
Alex Leach Avatar asked Sep 23 '11 12:09

Alex Leach


People also ask

How configure Apache forward proxy?

The client is configured to use the forward proxy to access other sites. When a client want to get the content from the origin server, it sends a request to the proxy naming the origin server as the target. The proxy then requests the content from the origin server and returns it to the client.

What is URL rewrite in Apache?

URL rewriting purpose is to change the appearance of the URL to a more user-friendly URL. This modification is called URL rewriting. For example, http://example.com/form.html can be rewritten as http://example.com/form using URL rewriting.

Can Apache act as proxy server?

In addition to being a "basic" web server, and providing static and dynamic content to end-users, Apache httpd (as well as most other web servers) can also act as a reverse proxy server, also-known-as a "gateway" server.

Can I use Apache as reverse proxy?

The ability to use Apache as a reverse proxy is provided through a shared library named mod_proxy.so. This module is not enabled by default, so you must edit Apache's httpd. conf file to enable it. You also need to enable Apache's mod_proxy_http.so shared library.


1 Answers

Using mod_proxy would work just fine. For instance, I mapped https://localhost/yalla/ to point to a subdirectory of my webserver:

LoadModule proxy_module modules/mod_proxy.so
ProxyRequests On
<Proxy *>
      Order deny,allow
      Allow from localhost
</Proxy>
ProxyPass /yalla/ http://yalla.ynfonatic.de/tmp/

If you implement this, you'll note that the pictues of the directory-listing aren't visible; this is because they're below the /tmp/ directory on the remote server, hence not visible.

So, in your case you'd do:

LoadModule proxy_module modules/mod_proxy.so
ProxyRequests On
<Proxy *>
      Order deny,allow
      Allow from localhost # Or whatever your network is if you need an ACL
</Proxy>
ProxyPass /app/ http://hostname.example.com:8080/

Like with everything in Apache configuration, watch those trailing slashes when referring to directories.

Good luck! Alex.

like image 112
Alexander Janssen Avatar answered Oct 05 '22 05:10

Alexander Janssen