nginx-proxy-manager/backend/templates/_location.conf
Charles Wilkinson 214efca62c Fix proper handling of paths and parameters
Nginx proxy_pass does not handle paths and parameters in a graceful way when using variables for the host. As such we have to handle it manually. See here: https://dev.to/danielkun/nginx-everything-about-proxypass-2ona#let-nginx-start-even-when-not-all-upstream-hosts-are-available
2023-03-19 11:09:50 +00:00

47 lines
1.8 KiB
Text

location {{ path }} {
set $forward_scheme {{ forward_scheme }};
set $forward_host {{ forward_host }};
set $forward_port {{ forward_port }};
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Scheme $scheme;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
{% assign location_path_end_char = path | slice: -1 %}
{% assign forward_path_end_char = forward_path | slice: -1 %}
{% if location_path_end_char == "/" and forward_path_end_char != "/" %}
if ($request_uri ~ "{{ path }}(.*$)") {
# Location path ends with / but forward path doesn't, so we prefix $path_remainder with a slash.
set $uri_remainder /$1;
}
{% elsif location_path_end_char != "/" and forward_path_end_char == "/" %}
# Location path does not have a trailing / but forward path does, so we make sure to capture $uri_remainder without a leading slash.
if ($request_uri ~ "{{ path }}/(.*$)") {
set $uri_remainder $1;
}
{% else %}
# Either both location path and forward path have a trailing /, or neither do, so we make sure to capture $uri_remainder with a leading slash (if it has one).
if ($request_uri ~ "{{ path }}(.*$)") {
set $uri_remainder $1;
}
{% endif %}
proxy_pass $forward_scheme://$forward_host:$forward_port{{ forward_path }}$uri_remainder;
{% include "_access.conf" %}
{% include "_assets.conf" %}
{% include "_exploits.conf" %}
{% include "_forced_ssl.conf" %}
{% include "_hsts.conf" %}
{% if allow_websocket_upgrade == 1 or allow_websocket_upgrade == true %}
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_http_version 1.1;
{% endif %}
{{ advanced_config }}
}