2

I have seen How to handle relative urls correctly with a reverse proxy - however I have great troubles understanding this (and applying it to my problem), hope someone can help.

Let's say that I have Ubuntu 20.04 as a server OS on my server, example.com.

Then, I install https://github.com/hartwork/jawanndenn on the server, and run it - this application by default runs on port 8080; and I can confirm that it runs on the server itself, by running:

wget -O- http://127.0.0.1:8080

So far, so good. Now, what I would like, is that: instead of accessing https://example.com:8080 to access this application, I'd like like to access https://example.com/jaw - where I'd usually call /jaw a "subdirectory", but it is maybe more accurately a relative URL. In other words, if I understand the terminology correctly, https://example.com/jaw would reverse proxy to https://example.com:8080.

So, I've tried doing this, within the <VirtualHost *:443> definition in my .conf file:

  <Location /jaw>
    Options -Multiviews -Indexes
    RewriteEngine On
    ProxyPass         http://127.0.0.1:8080
    ProxyPassReverse  http://127.0.0.1:8080
    SetOutputFilter proxy-html
    ProxyHTMLURLMap http://127.0.0.1:8080
  </Location>
  RewriteRule ^/jaw$ /jaw/ [R]

This works - in the sense that, the starting page of the application is loaded; but a whole ton of resources (.css, .js) cannot be loaded; opening the console in my browser, I can see a bunch of 404'd requests for:

https://example.com/static/3rdparty/jquery-3.5.1/jquery-3.5.1.min.js
https://example.com/static/3rdparty/roboto-20/css/roboto.css
...

So, my guess is, there are some .js files or similar, that simply want to load /static/... -> and if called from the "port" address, they'd map to http://127.0.0.1:8080/static/... and all would be fine; but now, since we're proxied:

  • browser requests https://example.com/jaw
  • Apache gets that, forwards it to https://example.com:8080, where the application listens
  • Application sends back files (.js), that have links in the form /static/...
  • Once those arrive back in the browser, they are interpreted as https://example.com/static/... - before being used as requests for the server, which then cannot find them

I've also tried getting rid of the entire <Location> snippet above, and just using this in the <VirtualHost *:443> node:

  ProxyPass /jaw/ http://127.0.0.1:6789/
  ProxyPassReverse /jaw/ http://127.0.0.1:6789/

Exactly the same happens as previously - first page gets loaded, all the other resources apparently refger to /static/... and they all 404.

Finally, I got rid of the above statements too, and used this:

  ProxyPass /jaw/  http://127.0.0.1:8080
  ProxyHTMLURLMap http://127.0.0.1:8080  /jaw
  <Location /jaw/>
    ProxyPassReverse /
    ProxyPassReverse http://127.0.0.1:8080
    ProxyHTMLEnable On
    ProxyHTMLURLMap  /  /jaw/
  </Location>

This has the exact same behavior - first page loads, resources fail - except resources are now listed in browser console as:

https://example.com/jaw/static/3rdparty/jquery-3.5.1/jquery-3.5.1.min.js
https://example.com/jaw/static/3rdparty/roboto-20/css/roboto.css
...

... and they fail with 502 Proxy Error. So some rewrite happened, but something is not right still.

So my question is - how can I say to Apache, to proxy everything from the application on 127.0.0.1:8080, to something that appears as a "subdirectory" (relative URL? here /jaw)?


Edit: turns out, the 502 Proxy Error was due to:

AH00898: DNS lookup failure for: 127.0.0.1:6789static returned by /poll/static/js/html.js

... so clearly a slash is missing; so it ended up that this:

  ProxyPass /jaw/  http://127.0.0.1:8080/
  ProxyHTMLURLMap http://127.0.0.1:8080/  /jaw/
  <Location /jaw/>
    ProxyPassReverse /
    ProxyPassReverse http://127.0.0.1:8080/
    ProxyHTMLEnable On
    ProxyHTMLURLMap  /  /jaw/
  </Location>

... actually does work - for the most part (the /static resources); but then, there is a call to /data that does not get handled by this ... So it's still an open question (for me) how to proxy "everything"

sdbbs
  • 123
  • 5
  • 2
    Configure your backend server with the correct base url. That's much easier than forcing rewrites on the proxy. – Gerald Schneider Nov 30 '21 at 15:45
  • Thanks @GeraldSchneider - that helped me to realize this application has a `--url-prefix` argument, and that ended up working for me ... – sdbbs Nov 30 '21 at 15:49

1 Answers1

3

Configure your backend server with the correct base url. That's much easier than forcing rewrites on the proxy.

The setting should be JAWANNDENN_URL_PREFIX . Just set it to /jaw and all URLs should be generated properly.

Your first example should then work, even without the ProxyHTMLURLMap and the OutputFilter.

Gerald Schneider
  • 19,757
  • 8
  • 52
  • 79
  • Thanks, I ended up using the `--url-prefix` to specify `JAWANNDENN_URL_PREFIX` to "`jaw`", and then just `ProxyPass/ProxyPassReverse /jaw/ http://127.0.0.1:8080/jaw/` works fine for the proxy. – sdbbs Nov 30 '21 at 15:53