reverse proxy does not load webpage data
Francis Daly
francis at daoine.org
Mon Feb 1 10:53:12 UTC 2021
On Mon, Feb 01, 2021 at 03:11:57AM -0500, petrg wrote:
Hi there,
> If I call the webpage from a connected PC (PC-browser) everything is working
> fine.
> But now I’d like to run a reverse-proxy (PC-proxy) in between.
> So the PC-browser does not see the PC-device anymore.
> This structure of a reverse proxy looks very basic for me. But I don’t get
> it run.
>
> My configuration:
>
> PC-device
> /path/index.html
> <img src="/images/logo.jpg" …>
>
> nginx.conf
> location /images/
> absolute_image_path
>
> PC-proxy
> nginx.conf
> location /device/
> proxy_pass 192.168.5.1/path
> index.html
>
> PC-browser
> url: 192.168.1.1/device/index.html
>
> => index.html will be loaded correctly from PC-device, because of the
> proxy-pass configuration
> => but the Logo-image, that will be loaded by the index.html, will not be
> found.
> So, how does a reverse-proxy load data for a webpage ?
There is no magic; it does what you configure it to do. The browser makes
a request to nginx; nginx handles that according to its config. Every
request is independent.
> How should nginx(PC-proxy) know, where to find the image-file
> /images/logo.jpg that is asked for by the webpage ?
You need to configure your nginx to do what you want it to do.
PC-proxy needs to know what request to make to PC-Device, when PC-Browser
asks PC-Proxy for /images/logo.jpg.
If you look at the PC-Proxy nginx logs, they should show what that nginx
saw, and what it did.
> Or is it necessary that all data of the webpage has to be relative to the
> starting point “192.168.1.1/device/index.html” ?
> I am not sure if my misunderstanding is related to the webpage structure or
> to the reverse-proxy function.
Possibly both? I will try to explain.
Your actual html page is on PC-device, in the file
/something/path/index.html.
It can include any or all of:
<img src="one.jpg">
<img src="/path/two.jpg">
<img src="http://PC-device/path/three.jpg">
<img src="http://192.168.5.1/path/four.jpg">
to refer to things in the same directory, or
<img src="/otherpath/five.jpg">
to refer to a thing in another directory.
When the browser talks to PC-Device directly and asks for
http://PC-device/path/index.html, it gets back the content, and then
it tries to make five new requests, for http://PC-device/path/one.jpg,
http://PC-device/path/two.jpg, http://PC-device/path/three.jpg,
http://192.168.5.1/path/four.jpg, and
http://PC-device/otherpath/five.jpg. All will probably work.
When the browser talks to PC-proxy and asks for
http://192.168.1.1/device/index.html it gets the same html back,
and it makes five new requests for http://192.168.1.1/device/one.jpg,
http://192.168.1.1/path/two.jpg, http://PC-device/path/three.jpg,
http://192.168.5.1/path/four.jpg, and
http://192.168.1.1/otherpath/five.jpg.
The first will work because of your nginx config; the second and fifth
will not work because you have not configured your nginx to make it
work; and the other two will (probably) not go to nginx on PC-proxy,
so no config there can help you.
In your case, you are doing something like "five.jpg".
So: you must either change the PC-device layout and html so that
everything is below /somewhere/path *and* all links are relative (i.e. do
not start with http: or with /); or change your nginx config so that
you also have something like
location /otherpath/ { proxy_pass http://PC-Device/images/; }
location /path/ { proxy_pass http://PC-Device/path/; }
(Although that second one would usually be written
location /path/ { proxy_pass http://PC-Device; }
-- see the docs for proxy_pass at http://nginx.org/r/proxy_path for details.)
And you will also need to change the PC-device html so that all links
are at least site-relative (i.e. do not start "http:"); or if the links
do use "http:", they use the name that the world should see (something
that resolves to PC-Proxy, not something that resolves to PC-Device).
In general:
* you reverse-proxy to something that you control
* the thing you are reverse-proxying, needs not to fight being
reverse-proxied
* it is often simplest if you reverse-proxy a thing at the same point in
the url-hierarchy that it thinks it is installed at. That is: if your
content is all below http://PC-Device/path/, it is probably simplest
to reverse-proxy that at http://PC-Proxy/path/. It is not compulsory;
but it would have made "two.jpg" Just Work in the example above.
Good luck with it,
f
--
Francis Daly francis at daoine.org
More information about the nginx
mailing list