Исправление логики портов для доменов с SSL, версия 1.8.8
This commit is contained in:
parent
c49f9ad7e0
commit
e6dc0a565d
107
rproxy
107
rproxy
|
|
@ -1,9 +1,9 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# rProxy — Менеджер обратного прокси для роутеров Keenetic / Netcraze
|
# rProxy — Менеджер обратного прокси для роутеров Keenetic / Netcraze
|
||||||
# Публикация локальных сервисов через SSH-туннели + nginx на VPS
|
# Публикация локальных сервисов через SSH-туннели + nginx на VPS
|
||||||
# https://github.com/l-ptrol/rProxy
|
# https://github.com/l-ptrol/rProxy
|
||||||
|
|
||||||
VERSION="1.8.6"
|
VERSION="1.8.8"
|
||||||
export PATH="/opt/bin:/opt/sbin:$PATH"
|
export PATH="/opt/bin:/opt/sbin:$PATH"
|
||||||
CONF_DIR="/opt/etc/rproxy"
|
CONF_DIR="/opt/etc/rproxy"
|
||||||
CONF_FILE="$CONF_DIR/rproxy.conf"
|
CONF_FILE="$CONF_DIR/rproxy.conf"
|
||||||
|
|
@ -972,39 +972,51 @@ do_edit_interactive() {
|
||||||
|
|
||||||
scp_cmd "$tmp" "$VPS_USER@$VPS_HOST:$remote_loc_dir/$name.conf"
|
scp_cmd "$tmp" "$VPS_USER@$VPS_HOST:$remote_loc_dir/$name.conf"
|
||||||
rm -f "$tmp"
|
rm -f "$tmp"
|
||||||
|
# Теперь эта функция генерирует ТОЛЬКО блоки location
|
||||||
|
# Основной конфиг сервера будет собираться отдельно
|
||||||
|
cat > "$target_file" << NGINXEOF
|
||||||
|
# Редирект с пути без слеша на путь со слешем (чтобы браузер не терял контекст)
|
||||||
|
if (\$request_uri = $path) {
|
||||||
|
return 301 \$scheme://\$host$path/;
|
||||||
|
}
|
||||||
|
|
||||||
# Пересборка основного конфига
|
location $location_path {
|
||||||
if [ -n "$SVC_DOMAIN" ]; then
|
$auth_config
|
||||||
rebuild_vhost_config "$SVC_DOMAIN" "$SVC_EXT_PORT" "$SVC_VPS"
|
proxy_pass http://127.0.0.1:$tunnel_port/;
|
||||||
else
|
proxy_http_version 1.1;
|
||||||
rebuild_ip_config "$name" "$SVC_EXT_PORT" "$SVC_TUNNEL_PORT" "$SVC_VPS"
|
proxy_set_header Upgrade \$http_upgrade;
|
||||||
fi
|
proxy_set_header Connection "upgrade";
|
||||||
|
proxy_set_header Host "$stealth_host";
|
||||||
|
proxy_set_header Origin "http://$stealth_host";
|
||||||
|
proxy_set_header Referer "http://$stealth_host";
|
||||||
|
proxy_set_header X-Real-IP \$remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto \$scheme;
|
||||||
|
proxy_set_header X-Forwarded-Host \$host;
|
||||||
|
proxy_set_header X-Forwarded-Server \$host;
|
||||||
|
proxy_set_header X-Forwarded-Path "$path";
|
||||||
|
|
||||||
|
proxy_cookie_domain "$t_host" "\$host";
|
||||||
|
proxy_cookie_path / "$path";
|
||||||
|
# Редиректы: если приложение шлет Location: /login, Nginx заменит на Location: $path/login
|
||||||
|
proxy_redirect / "$path/";
|
||||||
|
|
||||||
# SSL если он был настроен или сертификат уже есть
|
# Экспериментальная замена ссылок в HTML/JS для работы в подпутях (v1.8.7)
|
||||||
if [ "$SVC_SSL" = "yes" ] || { [ -n "$SVC_DOMAIN" ] && ssh_cmd "[ -f /etc/letsencrypt/live/$SVC_DOMAIN/fullchain.pem ]"; }; then
|
if (\$path != "/") {
|
||||||
# Если SVC_SSL была "no", но сертификат нашли — помечаем как "yes"
|
# Убираем сжатие от бэкенда, чтобы Nginx мог видеть текст
|
||||||
if [ "$SVC_SSL" = "no" ]; then
|
proxy_set_header Accept-Encoding "";
|
||||||
sed -i "s/SVC_SSL=.*/SVC_SSL=\"yes\"/" "$SERVICES_DIR/$name.conf"
|
sub_filter_once off;
|
||||||
# Пересобираем vhost чтобы включить SSL блок
|
sub_filter_types text/html text/css application/javascript application/json;
|
||||||
rebuild_vhost_config "$SVC_DOMAIN" "$SVC_EXT_PORT" "$SVC_VPS"
|
# Заменяем ссылки начинающиеся с / на /путь/
|
||||||
|
sub_filter '="/' '="$path/';
|
||||||
|
sub_filter '=\"/' '=\"$path/';
|
||||||
|
# Попытка поймать JS редиректы и AJAX
|
||||||
|
sub_filter 'location.href = \"/' 'location.href = \"$path/';
|
||||||
|
sub_filter 'url: \"/' 'url: \"$path/';
|
||||||
fi
|
fi
|
||||||
fi
|
}
|
||||||
|
NGINXEOF
|
||||||
# Обновление htpasswd на VPS если включено
|
<EFBFBD>══════
|
||||||
if [ "$SVC_NDM_AUTH" = "yes" ]; then
|
|
||||||
ssh_cmd "printf '%s\n' '$SVC_HTPASSWD' > /etc/nginx/rproxy_$name.htpasswd"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Перезапустить туннель если он был запущен
|
|
||||||
if [ "$was_running" -eq 1 ]; then
|
|
||||||
do_start_service "$name"
|
|
||||||
fi
|
|
||||||
|
|
||||||
msg "Сервис '$name' успешно обновлён локально и на VPS!"
|
|
||||||
pause
|
|
||||||
}
|
|
||||||
|
|
||||||
# ══════════════════════════════════════════════════════════════════════
|
|
||||||
# ВЫБОР СЕРВИСА (общий)
|
# ВЫБОР СЕРВИСА (общий)
|
||||||
# ══════════════════════════════════════════════════════════════════════
|
# ══════════════════════════════════════════════════════════════════════
|
||||||
select_service() {
|
select_service() {
|
||||||
|
|
@ -1298,7 +1310,15 @@ rebuild_vhost_config() {
|
||||||
server {
|
server {
|
||||||
EOF
|
EOF
|
||||||
# Не выводим обычный listen 443, если сейчас будет выведен listen 443 ssl
|
# Не выводим обычный listen 443, если сейчас будет выведен listen 443 ssl
|
||||||
if [ "$ext_port" != "443" ] || [ "$has_ssl" -eq 0 ]; then
|
if [ "$has_ssl" -eq 1 ]; then
|
||||||
|
echo " listen $ext_port ssl;" >> "$tmp_vhost"
|
||||||
|
cat >> "$tmp_vhost" << EOF
|
||||||
|
ssl_certificate $cert_file;
|
||||||
|
ssl_certificate_key $key_file;
|
||||||
|
include /etc/letsencrypt/options-ssl-nginx.conf;
|
||||||
|
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
|
||||||
|
EOF
|
||||||
|
else
|
||||||
echo " listen $ext_port;" >> "$tmp_vhost"
|
echo " listen $ext_port;" >> "$tmp_vhost"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
@ -1308,32 +1328,21 @@ EOF
|
||||||
proxy_request_buffering off;
|
proxy_request_buffering off;
|
||||||
|
|
||||||
include $REMOTE_LOCATIONS_DIR/$domain/*.conf;
|
include $REMOTE_LOCATIONS_DIR/$domain/*.conf;
|
||||||
|
}
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
if [ "$has_ssl" -eq 1 ]; then
|
|
||||||
cat >> "$tmp_vhost" << EOF
|
|
||||||
listen 443 ssl;
|
|
||||||
ssl_certificate $cert_file;
|
|
||||||
ssl_certificate_key $key_file;
|
|
||||||
include /etc/letsencrypt/options-ssl-nginx.conf;
|
|
||||||
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
|
|
||||||
EOF
|
|
||||||
fi
|
|
||||||
echo "}" >> "$tmp_vhost"
|
|
||||||
|
|
||||||
# Редирект с 80 на 443 если есть SSL
|
# Редирект с 80 на HTTPS (только если есть SSL и это не порт 80)
|
||||||
if [ "$has_ssl" -eq 1 ] && [ "$ext_port" != "80" ]; then
|
if [ "$has_ssl" -eq 1 ] && [ "$ext_port" != "80" ]; then
|
||||||
|
local redirect_url="https://\$host"
|
||||||
|
[ "$ext_port" != "443" ] && redirect_url="https://\$host:$ext_port"
|
||||||
cat >> "$tmp_vhost" << EOF
|
cat >> "$tmp_vhost" << EOF
|
||||||
server {
|
server {
|
||||||
listen 80;
|
listen 80;
|
||||||
server_name "$domain";
|
server_name "$domain";
|
||||||
return 301 https://\$host\$request_uri;
|
return 301 $redirect_url\$request_uri;
|
||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
fi
|
fi
|
||||||
|
|
||||||
scp_cmd "$tmp_vhost" "$VPS_USER@$VPS_HOST:$REMOTE_NGINX_DIR/rproxy_dom_$domain.conf"
|
|
||||||
else
|
|
||||||
# Это не должно вызываться для IP-публикаций напрямую через эту функцию
|
# Это не должно вызываться для IP-публикаций напрямую через эту функцию
|
||||||
# Но на всякий случай оставим заглушку
|
# Но на всякий случай оставим заглушку
|
||||||
return 1
|
return 1
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue