From 2772489f0d2b548621c4b1f1efe2bca3a2d7aa0a Mon Sep 17 00:00:00 2001 From: jerry-yuan Date: Fri, 11 Aug 2023 16:49:15 +0000 Subject: [PATCH] add forward path prefix to prefix services in a sub path. --- .../migrations/20230811144605_forward_path.js | 42 +++++++++++++++++++ backend/schema/endpoints/proxy-hosts.json | 15 +++++++ backend/templates/_location.conf | 2 +- backend/templates/proxy_host.conf | 1 + docker/rootfs/etc/nginx/conf.d/default.conf | 1 + .../etc/nginx/conf.d/include/proxy.conf | 2 +- frontend/js/app/nginx/proxy/form.ejs | 6 +++ frontend/js/app/nginx/proxy/form.js | 5 ++- frontend/js/app/nginx/proxy/list/item.ejs | 2 +- frontend/js/app/nginx/proxy/location-item.ejs | 6 +++ frontend/js/i18n/messages.json | 1 + frontend/js/models/proxy-host-location.js | 3 +- frontend/js/models/proxy-host.js | 1 + 13 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 backend/migrations/20230811144605_forward_path.js diff --git a/backend/migrations/20230811144605_forward_path.js b/backend/migrations/20230811144605_forward_path.js new file mode 100644 index 00000000..e812a0e1 --- /dev/null +++ b/backend/migrations/20230811144605_forward_path.js @@ -0,0 +1,42 @@ +const migrate_name = 'identifier_for_migrate'; +const logger = require('../logger').migrate; + +/** + * Migrate + * + * @see http://knexjs.org/#Schema + * + * @param {Object} knex + * @param {Promise} Promise + * @returns {Promise} + */ +exports.up = function (knex, Promise) { + + logger.info('[' + migrate_name + '] Migrating Up...'); + + + return knex.schema.alterTable('proxy_host',function(table){ + table.string("forward_path_prefix").notNull().defaultTo(""); + }) + .then(function() { + logger.info('[' + migrate_name + '] Migrating Up Complete'); + }) +}; + +/** + * Undo Migrate + * + * @param {Object} knex + * @param {Promise} Promise + * @returns {Promise} + */ +exports.down = function (knex, Promise) { + logger.info('[' + migrate_name + '] Migrating Down...'); + + return knex.schema.alterTable("proxy_host", function(table){ + table.dropColumn('forward_path_prefix'); + }) + .then(() => { + logger.info('[' + migrate_name + '] Migrating Down Complete'); + }); +}; diff --git a/backend/schema/endpoints/proxy-hosts.json b/backend/schema/endpoints/proxy-hosts.json index 9a3fff2f..8d6b61d2 100644 --- a/backend/schema/endpoints/proxy-hosts.json +++ b/backend/schema/endpoints/proxy-hosts.json @@ -32,6 +32,11 @@ "minimum": 1, "maximum": 65535 }, + "forward_path_prefix":{ + "type":"string", + "pattern": "^(\/[^/]+)*$", + "maxLength":255 + }, "certificate_id": { "$ref": "../definitions.json#/definitions/certificate_id" }, @@ -102,6 +107,10 @@ "forward_path": { "type": "string" }, + "forward_path_prefix":{ + "type":"string", + "pattern": "^(\/[^/]+)*$" + }, "advanced_config": { "type": "string" } @@ -221,6 +230,9 @@ "forward_port": { "$ref": "#/definitions/forward_port" }, + "forward_path_prefix":{ + "$ref": "#/definitions/forward_path_prefix" + }, "certificate_id": { "$ref": "#/definitions/certificate_id" }, @@ -294,6 +306,9 @@ "forward_port": { "$ref": "#/definitions/forward_port" }, + "forward_path_prefix":{ + "$ref": "#/definitions/forward_path_prefix" + }, "certificate_id": { "$ref": "#/definitions/certificate_id" }, diff --git a/backend/templates/_location.conf b/backend/templates/_location.conf index 2ee0d31b..f6637ad1 100644 --- a/backend/templates/_location.conf +++ b/backend/templates/_location.conf @@ -4,7 +4,7 @@ proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Real-IP $remote_addr; - proxy_pass {{ forward_scheme }}://{{ forward_host }}:{{ forward_port }}{{ forward_path }}; + proxy_pass {{ forward_scheme }}://{{ forward_host }}:{{ forward_port }}{{ forward_path_prefix }}{{ forward_path }}; {% include "_access.conf" %} {% include "_assets.conf" %} diff --git a/backend/templates/proxy_host.conf b/backend/templates/proxy_host.conf index 81a542ea..d7876ac4 100644 --- a/backend/templates/proxy_host.conf +++ b/backend/templates/proxy_host.conf @@ -5,6 +5,7 @@ server { set $forward_scheme {{ forward_scheme }}; set $server "{{ forward_host }}"; set $port {{ forward_port }}; + set $path_prefix "{{ forward_path_prefix }}"; {% include "_listen.conf" %} {% include "_certificates.conf" %} diff --git a/docker/rootfs/etc/nginx/conf.d/default.conf b/docker/rootfs/etc/nginx/conf.d/default.conf index e4262e1d..af7ff1b1 100644 --- a/docker/rootfs/etc/nginx/conf.d/default.conf +++ b/docker/rootfs/etc/nginx/conf.d/default.conf @@ -6,6 +6,7 @@ server { set $forward_scheme "http"; set $server "127.0.0.1"; set $port "80"; + set $path_prefix ""; server_name localhost-nginx-proxy-manager; access_log /data/logs/fallback_access.log standard; diff --git a/docker/rootfs/etc/nginx/conf.d/include/proxy.conf b/docker/rootfs/etc/nginx/conf.d/include/proxy.conf index d346c4ef..82879b40 100644 --- a/docker/rootfs/etc/nginx/conf.d/include/proxy.conf +++ b/docker/rootfs/etc/nginx/conf.d/include/proxy.conf @@ -4,5 +4,5 @@ proxy_set_header X-Forwarded-Scheme $scheme; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; -proxy_pass $forward_scheme://$server:$port$request_uri; +proxy_pass $forward_scheme://$server:$port$path_prefix$request_uri; diff --git a/frontend/js/app/nginx/proxy/form.ejs b/frontend/js/app/nginx/proxy/form.ejs index 56868f55..4e90a480 100644 --- a/frontend/js/app/nginx/proxy/form.ejs +++ b/frontend/js/app/nginx/proxy/form.ejs @@ -54,6 +54,12 @@ +
+
+ + +
+
-
<%- forward_scheme %>://<%- forward_host %>:<%- forward_port %>
+
<%- forward_scheme %>://<%- forward_host %>:<%- forward_port %><%- forward_path_prefix %>
<%- certificate && certificate_id ? i18n('ssl', certificate.provider) : i18n('ssl', 'none') %>
diff --git a/frontend/js/app/nginx/proxy/location-item.ejs b/frontend/js/app/nginx/proxy/location-item.ejs index 39445f7b..c9559b93 100644 --- a/frontend/js/app/nginx/proxy/location-item.ejs +++ b/frontend/js/app/nginx/proxy/location-item.ejs @@ -48,6 +48,12 @@
+
+
+ + +
+
diff --git a/frontend/js/i18n/messages.json b/frontend/js/i18n/messages.json index d77351d6..8b903cd1 100644 --- a/frontend/js/i18n/messages.json +++ b/frontend/js/i18n/messages.json @@ -125,6 +125,7 @@ "forward-scheme": "Scheme", "forward-host": "Forward Hostname / IP", "forward-port": "Forward Port", + "forward-path-prefix": "Forward Path Prefix", "delete": "Delete Proxy Host", "delete-confirm": "Are you sure you want to delete the Proxy host for: {domains}?", "help-title": "What is a Proxy Host?", diff --git a/frontend/js/models/proxy-host-location.js b/frontend/js/models/proxy-host-location.js index 2a35059f..0a3ceb83 100644 --- a/frontend/js/models/proxy-host-location.js +++ b/frontend/js/models/proxy-host-location.js @@ -10,7 +10,8 @@ const model = Backbone.Model.extend({ advanced_config: '', forward_scheme: 'http', forward_host: '', - forward_port: '80' + forward_port: '80', + forward_path_prefix:'' } }, diff --git a/frontend/js/models/proxy-host.js b/frontend/js/models/proxy-host.js index b82d09fe..3b328610 100644 --- a/frontend/js/models/proxy-host.js +++ b/frontend/js/models/proxy-host.js @@ -12,6 +12,7 @@ const model = Backbone.Model.extend({ forward_scheme: 'http', forward_host: '', forward_port: null, + forward_path_prefix: '', access_list_id: 0, certificate_id: 0, ssl_forced: false,