Add optional HTTP->HTTPS redirect per proxy target
Each target can now have an HTTP port with a checkbox to enable automatic redirect to HTTPS. Configurable in WebUI and API. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
0206b5b73a
commit
261482232c
25
app/app.py
25
app/app.py
|
|
@ -108,6 +108,9 @@ def generate_nginx_config(config):
|
|||
|
||||
location_block = _proxy_location_block(target_scheme, upstream_name)
|
||||
|
||||
http_redirect = target.get("http_redirect", False)
|
||||
http_port = target.get("http_port", 0)
|
||||
|
||||
# Domain-based routing
|
||||
if domains:
|
||||
for domain_entry in domains:
|
||||
|
|
@ -130,6 +133,15 @@ def generate_nginx_config(config):
|
|||
lines.append("}")
|
||||
lines.append("")
|
||||
|
||||
# HTTP -> HTTPS redirect for this domain
|
||||
if http_redirect and http_port:
|
||||
lines.append("server {")
|
||||
lines.append(f" listen {http_port};")
|
||||
lines.append(f" server_name {domain};")
|
||||
lines.append(f" return 301 https://$host:{domain_port}$request_uri;")
|
||||
lines.append("}")
|
||||
lines.append("")
|
||||
|
||||
# IP/Port-based routing
|
||||
if listen_port:
|
||||
lines.append("server {")
|
||||
|
|
@ -147,6 +159,15 @@ def generate_nginx_config(config):
|
|||
lines.append("}")
|
||||
lines.append("")
|
||||
|
||||
# HTTP -> HTTPS redirect for this port
|
||||
if http_redirect and http_port:
|
||||
lines.append("server {")
|
||||
lines.append(f" listen {http_port};")
|
||||
lines.append(f" server_name _;")
|
||||
lines.append(f" return 301 https://$host:{listen_port}$request_uri;")
|
||||
lines.append("}")
|
||||
lines.append("")
|
||||
|
||||
conf_content = "\n".join(lines)
|
||||
os.makedirs(NGINX_CONF_DIR, exist_ok=True)
|
||||
with open(NGINX_UPSTREAM_CONF, "w") as f:
|
||||
|
|
@ -273,6 +294,8 @@ def add_target():
|
|||
"target_port": int(request.form.get("target_port", 80)),
|
||||
"target_scheme": request.form.get("target_scheme", "http"),
|
||||
"listen_port": int(request.form.get("listen_port", 0) or 0),
|
||||
"http_redirect": request.form.get("http_redirect") == "on",
|
||||
"http_port": int(request.form.get("http_port", 0) or 0),
|
||||
"domains": domains,
|
||||
"enabled": True,
|
||||
}
|
||||
|
|
@ -330,6 +353,8 @@ def edit_target(idx):
|
|||
"target_port": int(request.form.get("target_port", 80)),
|
||||
"target_scheme": request.form.get("target_scheme", "http"),
|
||||
"listen_port": int(request.form.get("listen_port", 0) or 0),
|
||||
"http_redirect": request.form.get("http_redirect") == "on",
|
||||
"http_port": int(request.form.get("http_port", 0) or 0),
|
||||
"domains": domains,
|
||||
"enabled": config["targets"][idx].get("enabled", True),
|
||||
}
|
||||
|
|
|
|||
|
|
@ -237,6 +237,16 @@
|
|||
<label>Listen-Port (fuer IP-Zugriff)</label>
|
||||
<input type="number" name="listen_port" placeholder="z.B. 8080" min="0" max="65535">
|
||||
</div>
|
||||
<div class="form-group" style="max-width: 200px;">
|
||||
<label>HTTP-Port (Redirect)</label>
|
||||
<input type="number" name="http_port" placeholder="z.B. 8080" min="0" max="65535">
|
||||
</div>
|
||||
<div class="form-group" style="max-width: 200px; justify-content: center;">
|
||||
<label>
|
||||
<input type="checkbox" name="http_redirect" style="width:auto;margin-right:6px;">
|
||||
HTTP → HTTPS Redirect
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
|
|
@ -301,6 +311,11 @@
|
|||
<span>Domain:</span> {{ d.domain }}:{{ d.port }}
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% if target.http_redirect and target.http_port %}
|
||||
<div class="target-detail">
|
||||
<span>HTTP Redirect:</span> Port {{ target.http_port }} → HTTPS
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!-- Edit form -->
|
||||
|
|
@ -332,6 +347,17 @@
|
|||
<label>Listen-Port</label>
|
||||
<input type="number" name="listen_port" value="{{ target.listen_port or '' }}">
|
||||
</div>
|
||||
<div class="form-group" style="max-width: 200px;">
|
||||
<label>HTTP-Port (Redirect)</label>
|
||||
<input type="number" name="http_port" value="{{ target.http_port or '' }}">
|
||||
</div>
|
||||
<div class="form-group" style="max-width: 200px; justify-content: center;">
|
||||
<label>
|
||||
<input type="checkbox" name="http_redirect" style="width:auto;margin-right:6px;"
|
||||
{{ "checked" if target.http_redirect }}>
|
||||
HTTP → HTTPS Redirect
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>Domaenen</label>
|
||||
|
|
|
|||
Loading…
Reference in New Issue