Nginx Reverse Proxy Lowercase URL and some exceptions to the URL

Francis Daly francis at daoine.org
Sun Oct 6 11:14:35 UTC 2019


On Sat, Oct 05, 2019 at 12:44:30PM -0400, Alex Med wrote:

Hi there,

Good that you have a configuration that works for you.

If you want to spend more time on it, you may be able to remove some of
the duplication; but that is not necessary.

> I even included the proxy configuration parameters for the
> websocket connection to work.

Good stuff.

I would expect that the extra "websockets" configuration is not necessary
for non-websocket requests; so you might be able to add new location{}s
for just-websocket-requests -- but again, if what you have works, there
is no need to change anything.

> I noticed that the location =/  does not
> support OR  so I had create two additional locations to catch paths without
> the end forward slash.

Correct. "location =" is for an exact string match.

>  Is there a limit in the number of location that a
> configuration file should have?

"As many as it needs". If it needs more than your hardware can handle,
you need different hardware.

Which is just a way of saying: no, there is no practical limit that you
will meet.

> Thank YOU again for being in this forum and helping everyone!

You're welcome.

> location ~
> ^/(api|contentAsset|categoriesServlet|DotAjaxDirector|html|dwr|dA|JsonTags)/
> {

So - this location will match requests that start with "/X/" for each of
the eight strings in the pattern -- matching case-sensitively, because
you write "~" and not "~*".

>             proxy_pass http://xxx.xx.xx.xxx:IIII;

That line says to proxy_pass these requests elsewhere.

>             proxy_set_header  Host $host;
>             proxy_set_header  X-Real-IP $remote_addr;
>             proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
>             proxy_connect_timeout 600;
>             proxy_send_timeout 600;
>             proxy_read_timeout 600;
>             proxy_redirect off;

And those lines set some proxy-specific variables.

Because those same extra lines appear in many location{}s, you *could*
choose to put them at server{} level once, outside all location{}s, and
they would inherit into those location{}s, per the normal nginx method.

> location = /categoriesServlet {

This location will match exactly that request.

>             proxy_pass http://xxx.xx.xx.xxx:IIII;

That line is needed.

>             proxy_set_header  Host $host;
>             proxy_set_header  X-Real-IP $remote_addr;
>             proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
>             proxy_connect_timeout 600;
>             proxy_send_timeout 600;
>             proxy_read_timeout 600;
>             proxy_redirect off;
> 
>             ###
>             ### ADD THIS FOR WEBSOCKET SUPPORT
>             ###
> 
>                proxy_http_version 1.1;
>                proxy_set_header Upgrade $http_upgrade;
>                proxy_set_header Connection "Upgrade";

Those lines could be removed from here, if they were all set at server{}
level.

> location = /JSONTags {
>             proxy_pass http://xxx.xx.xx.xxx:IIII;

Same story here -- exactly one request handled, this capitalisation only.

>       location ~ [A-Z] {

This will match any request that includes a capital letter.

>             return 301 $scheme://$host$my_uri_to_lowercase;

And will return a redirect to the matching lowercased-request.

>             proxy_pass http://xxx.xx.xx.xxx:IIII;

This line (and the rest of them below) will not do anything, because the
"return" happens first.

>          location / {
>             proxy_pass http://xxx.xx.xx.xxx:IIII;

This location will match any other requests, and will proxy_pass them
to upstream.

Cheers,

	f
-- 
Francis Daly        francis at daoine.org


More information about the nginx mailing list