diff --git a/docs/configuration/optional-settings.md b/docs/configuration/optional-settings.md index fc8c13ea0..9e466ddc1 100644 --- a/docs/configuration/optional-settings.md +++ b/docs/configuration/optional-settings.md @@ -26,6 +26,18 @@ BANNER_BOTTOM = BANNER_TOP --- +## BASE_PATH + +Default: None + +The base URL path to use when accessing NetBox. Do not include the scheme or domain name. For example, if installed at http://example.com/netbox/, set: + +``` +BASE_PATH = 'netbox/' +``` + +--- + ## DEBUG Default: False diff --git a/netbox/netbox/configuration.docker.py b/netbox/netbox/configuration.docker.py index 6906ab1b4..81993ee21 100644 --- a/netbox/netbox/configuration.docker.py +++ b/netbox/netbox/configuration.docker.py @@ -52,6 +52,10 @@ EMAIL = { # are permitted to access most data in NetBox (excluding secrets) but not make any changes. LOGIN_REQUIRED = os.environ.get('LOGIN_REQUIRED', False) +# Base URL path if accessing NetBox within a directory. For example, if installed at http://example.com/netbox/, set: +# BASE_PATH = 'netbox/' +BASE_PATH = os.environ.get('BASE_PATH', '') + # Setting this to True will display a "maintenance mode" banner at the top of every page. MAINTENANCE_MODE = os.environ.get('MAINTENANCE_MODE', False) diff --git a/netbox/netbox/configuration.example.py b/netbox/netbox/configuration.example.py index 603327c6e..b85fcafbb 100644 --- a/netbox/netbox/configuration.example.py +++ b/netbox/netbox/configuration.example.py @@ -52,6 +52,10 @@ EMAIL = { # are permitted to access most data in NetBox (excluding secrets) but not make any changes. LOGIN_REQUIRED = False +# Base URL path if accessing NetBox within a directory. For example, if installed at http://example.com/netbox/, set: +# BASE_PATH = 'netbox/' +BASE_PATH = '' + # Setting this to True will display a "maintenance mode" banner at the top of every page. MAINTENANCE_MODE = False diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index ef25ae84f..efd0fae18 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -27,6 +27,9 @@ ADMINS = getattr(configuration, 'ADMINS', []) DEBUG = getattr(configuration, 'DEBUG', False) EMAIL = getattr(configuration, 'EMAIL', {}) LOGIN_REQUIRED = getattr(configuration, 'LOGIN_REQUIRED', False) +BASE_PATH = getattr(configuration, 'BASE_PATH', '') +if BASE_PATH: + BASE_PATH = BASE_PATH.strip('/') + '/' # Enforce trailing slash only MAINTENANCE_MODE = getattr(configuration, 'MAINTENANCE_MODE', False) PAGINATE_COUNT = getattr(configuration, 'PAGINATE_COUNT', 50) NETBOX_USERNAME = getattr(configuration, 'NETBOX_USERNAME', '') diff --git a/netbox/netbox/urls.py b/netbox/netbox/urls.py index b67f04cfd..645e56b45 100644 --- a/netbox/netbox/urls.py +++ b/netbox/netbox/urls.py @@ -1,3 +1,4 @@ +from django.conf import settings from django.conf.urls import include, url from django.contrib import admin from django.views.defaults import page_not_found @@ -10,35 +11,39 @@ handler500 = handle_500 urlpatterns = [ - # Default page - url(r'^$', home, name='home'), + url(r'^{}'.format(settings.BASE_PATH), include([ - # Login/logout - url(r'^login/$', login, name='login'), - url(r'^logout/$', logout, name='logout'), + # Default page + url(r'^$', home, name='home'), - # Apps - url(r'^circuits/', include('circuits.urls', namespace='circuits')), - url(r'^dcim/', include('dcim.urls', namespace='dcim')), - url(r'^ipam/', include('ipam.urls', namespace='ipam')), - url(r'^secrets/', include('secrets.urls', namespace='secrets')), - url(r'^tenancy/', include('tenancy.urls', namespace='tenancy')), - url(r'^profile/', include('users.urls', namespace='users')), + # Login/logout + url(r'^login/$', login, name='login'), + url(r'^logout/$', logout, name='logout'), - # API - url(r'^api/circuits/', include('circuits.api.urls', namespace='circuits-api')), - url(r'^api/dcim/', include('dcim.api.urls', namespace='dcim-api')), - url(r'^api/ipam/', include('ipam.api.urls', namespace='ipam-api')), - url(r'^api/secrets/', include('secrets.api.urls', namespace='secrets-api')), - url(r'^api/tenancy/', include('tenancy.api.urls', namespace='tenancy-api')), - url(r'^api/docs/', include('rest_framework_swagger.urls')), - url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), + # Apps + url(r'^circuits/', include('circuits.urls', namespace='circuits')), + url(r'^dcim/', include('dcim.urls', namespace='dcim')), + url(r'^ipam/', include('ipam.urls', namespace='ipam')), + url(r'^secrets/', include('secrets.urls', namespace='secrets')), + url(r'^tenancy/', include('tenancy.urls', namespace='tenancy')), + url(r'^profile/', include('users.urls', namespace='users')), - # Error testing - url(r'^404/$', page_not_found), - url(r'^500/$', trigger_500), + # API + url(r'^api/circuits/', include('circuits.api.urls', namespace='circuits-api')), + url(r'^api/dcim/', include('dcim.api.urls', namespace='dcim-api')), + url(r'^api/ipam/', include('ipam.api.urls', namespace='ipam-api')), + url(r'^api/secrets/', include('secrets.api.urls', namespace='secrets-api')), + url(r'^api/tenancy/', include('tenancy.api.urls', namespace='tenancy-api')), + url(r'^api/docs/', include('rest_framework_swagger.urls')), + url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), - # Admin - url(r'^admin/', include(admin.site.urls)), + # Error testing + url(r'^404/$', page_not_found), + url(r'^500/$', trigger_500), + + # Admin + url(r'^admin/', include(admin.site.urls)), + + ])) ] diff --git a/netbox/templates/500.html b/netbox/templates/500.html index 26f005f3b..ba2ebf94f 100644 --- a/netbox/templates/500.html +++ b/netbox/templates/500.html @@ -26,7 +26,7 @@
{{ exception }}diff --git a/netbox/templates/_base.html b/netbox/templates/_base.html index 6b9467ad6..9ef5ef4eb 100644 --- a/netbox/templates/_base.html +++ b/netbox/templates/_base.html @@ -21,7 +21,7 @@ - +
{{ error }}