diff --git a/README.md b/README.md
index 9fa19f1a8..45aa1b875 100644
--- a/README.md
+++ b/README.md
@@ -82,6 +82,7 @@ sysutils/vmware -- VMware tools
sysutils/xen -- Xen guest utilities
www/c-icap -- c-icap connects the web proxy with a virus scanner
www/cache -- Webserver cache
+www/nginx -- Nginx HTTP server and reverse proxy
www/web-proxy-sso -- Kerberos authentication module
www/web-proxy-useracl -- Group and user ACL for the web proxy
```
diff --git a/www/nginx/Makefile b/www/nginx/Makefile
new file mode 100644
index 000000000..849242b50
--- /dev/null
+++ b/www/nginx/Makefile
@@ -0,0 +1,8 @@
+PLUGIN_NAME= nginx
+PLUGIN_VERSION= 0.2
+PLUGIN_COMMENT= Nginx HTTP server and reverse proxy
+PLUGIN_DEPENDS= nginx
+PLUGIN_MAINTAINER= franz.fabian.94@gmail.com
+PLUGIN_DEVEL= yes
+
+.include "../../Mk/plugins.mk"
diff --git a/www/nginx/pkg-descr b/www/nginx/pkg-descr
new file mode 100644
index 000000000..3f1a716e4
--- /dev/null
+++ b/www/nginx/pkg-descr
@@ -0,0 +1,8 @@
+NGINX is a high performance edge web server with the lowest memory footprint
+and the key features to build modern and efficient web infrastructure.
+
+NGINX functionality includes HTTP server, HTTP and mail reverse proxy, caching,
+load balancing, compression, request throttling, connection multiplexing and
+reuse, SSL offload and HTTP media streaming.
+
+WWW: https://nginx.org/
diff --git a/www/nginx/src/etc/nginx/views/opnsense_error_404.html b/www/nginx/src/etc/nginx/views/opnsense_error_404.html
new file mode 100644
index 000000000..872bf103d
--- /dev/null
+++ b/www/nginx/src/etc/nginx/views/opnsense_error_404.html
@@ -0,0 +1,23 @@
+
+
+
+
+ Request Denied
+
+
+
+
+
+
Not Found
+
The resource you want to access is not available.
+
Please contact the webmaster if you think this is an error.
+
+
\ No newline at end of file
diff --git a/www/nginx/src/etc/nginx/views/opnsense_server_error.html b/www/nginx/src/etc/nginx/views/opnsense_server_error.html
new file mode 100644
index 000000000..e43586293
--- /dev/null
+++ b/www/nginx/src/etc/nginx/views/opnsense_server_error.html
@@ -0,0 +1,23 @@
+
+
+
+
+ Request Denied
+
+
+
+
+
+
Server Error
+
Sorry, but something went wrong on our side.
+
There is nothing you can do except waiting until we fix the issue.
+
+
\ No newline at end of file
diff --git a/www/nginx/src/etc/nginx/views/waf_denied.html b/www/nginx/src/etc/nginx/views/waf_denied.html
new file mode 100644
index 000000000..b5e96d2c9
--- /dev/null
+++ b/www/nginx/src/etc/nginx/views/waf_denied.html
@@ -0,0 +1,60 @@
+
+
+
+
+ Request Denied
+
+
+
+
+
+
Request Denied For Security Reasons
+
The request has been denied by the web application firewall due to a security policy violation.
+
Request information have been logged to investigate the incident.
+
If you think this is an error on our side, please contact us.
+
+
+
+
diff --git a/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/Api/ServiceController.php b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/Api/ServiceController.php
new file mode 100644
index 000000000..1506ee913
--- /dev/null
+++ b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/Api/ServiceController.php
@@ -0,0 +1,103 @@
+
+ * Copyright (C) 2016 IT-assistans Sverige AB
+ * Copyright (C) 2015-2016 Deciso B.V.
+ * Copyright (C) 2018 Fabian Franz
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+namespace OPNsense\Nginx\Api;
+
+use OPNsense\Base\ApiMutableServiceControllerBase;
+use OPNsense\Core\Backend;
+
+class ServiceController extends ApiMutableServiceControllerBase
+{
+ static protected $internalServiceClass = '\OPNsense\Nginx\Nginx';
+ static protected $internalServiceTemplate = 'OPNsense/Nginx';
+ static protected $internalServiceEnabled = 'general.enabled';
+ static protected $internalServiceName = 'nginx';
+
+ /**
+ * override parent method - stopping nginx is not allowed because otherwise you would loose
+ * access to the web interface
+ */
+ public function stopAction()
+ {
+ return array('status' => 'failed');
+ }
+
+
+ /**
+ * reconfigure with optional stop, generate config and start / reload
+ * @return array response message
+ * @throws \Exception when configd action fails
+ * @throws \ReflectionException when model can't be instantiated
+ */
+ public function reconfigureAction()
+ {
+ if ($this->request->isPost()) {
+ $this->sessionClose();
+ $model = $this->getModel();
+ $backend = new Backend();
+ if ($this->reconfigureForceRestart()) {
+ $backend->configdRun('nginx stop');
+ }
+ $backend->configdRun('template reload OPNsense/Nginx');
+ $runStatus = $this->statusAction();
+ if ($runStatus['status'] != 'running') {
+ $backend->configdRun('nginx start');
+ } else {
+ $backend->configdRun('nginx reload');
+ }
+ return array('status' => 'ok');
+ } else {
+ return array('status' => 'failed');
+ }
+ }
+
+ /**
+ * retrieve status of service
+ * @return array response message
+ * @throws \Exception when configd action fails
+ */
+ public function statusAction()
+ {
+ $backend = new Backend();
+ $model = $this->getModel();
+ $response = $backend->configdRun('nginx status');
+
+ if (strpos($response, 'not running') > 0) {
+ $status = 'stopped';
+ } elseif (strpos($response, 'is running') > 0) {
+ $status = 'running';
+ } else {
+ $status = 'unknown';
+ }
+
+ return array('status' => $status);
+ }
+}
diff --git a/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/Api/SettingsController.php b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/Api/SettingsController.php
new file mode 100644
index 000000000..54fc12e3a
--- /dev/null
+++ b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/Api/SettingsController.php
@@ -0,0 +1,281 @@
+searchBase('userlist', array('name', 'users'));
+ }
+
+ public function getuserlistAction($uuid = null)
+ {
+ $this->sessionClose();
+ return $this->getBase('userlist', 'userlist', $uuid);
+ }
+
+ public function adduserlistAction()
+ {
+ return $this->addBase('userlist', 'userlist');
+ }
+
+ public function deluserlistAction($uuid)
+ {
+ return $this->delBase('userlist', $uuid);
+ }
+
+ public function setuserlistAction($uuid)
+ {
+ return $this->setBase('userlist', 'userlist', $uuid);
+ }
+
+ // Credential
+ public function searchcredentialAction()
+ {
+ return $this->searchBase('credential', array('username'));
+ }
+
+ public function getcredentialAction($uuid = null)
+ {
+ $this->sessionClose();
+ return $this->getBase('credential', 'credential', $uuid);
+ }
+
+ public function addcredentialAction()
+ {
+ return $this->addBase('credential', 'credential');
+ }
+
+ public function delcredentialAction($uuid)
+ {
+ return $this->delBase('credential', $uuid);
+ }
+
+ public function setcredentialAction($uuid)
+ {
+ return $this->setBase('credential', 'credential', $uuid);
+ }
+
+ // Upstream
+ public function searchupstreamAction()
+ {
+ return $this->searchBase('upstream', array('description', 'serverentries'));
+ }
+
+ public function getupstreamAction($uuid = null)
+ {
+ $this->sessionClose();
+ return $this->getBase('upstream', 'upstream', $uuid);
+ }
+
+ public function addupstreamAction()
+ {
+ return $this->addBase('upstream', 'upstream');
+ }
+
+ public function delupstreamAction($uuid)
+ {
+ return $this->delBase('upstream', $uuid);
+ }
+
+ public function setupstreamAction($uuid)
+ {
+ return $this->setBase('upstream', 'upstream', $uuid);
+ }
+
+ // Upstream Server
+ public function searchupstreamserverAction()
+ {
+ return $this->searchBase('upstream_server', array('description', 'server', 'priority'));
+ }
+
+ public function getupstreamserverAction($uuid = null)
+ {
+ $this->sessionClose();
+ return $this->getBase('upstream_server', 'upstream_server', $uuid);
+ }
+
+ public function addupstreamserverAction()
+ {
+ return $this->addBase('upstream_server', 'upstream_server');
+ }
+
+ public function delupstreamserverAction($uuid)
+ {
+ return $this->delBase('upstream_server', $uuid);
+ }
+
+ public function setupstreamserverAction($uuid)
+ {
+ return $this->setBase('upstream_server', 'upstream_server', $uuid);
+ }
+
+ // Location
+ public function searchlocationAction()
+ {
+ return $this->searchBase('location', array('description','urlpattern', 'matchtype', 'enable_secrules', 'force_https'));
+ }
+
+ public function getlocationAction($uuid = null)
+ {
+ $this->sessionClose();
+ return $this->getBase('location', 'location', $uuid);
+ }
+
+ public function addlocationAction()
+ {
+ return $this->addBase('location', 'location');
+ }
+
+ public function dellocationAction($uuid)
+ {
+ return $this->delBase('location', $uuid);
+ }
+
+ public function setlocationAction($uuid)
+ {
+ return $this->setBase('location', 'location', $uuid);
+ }
+
+ // Custom Policy
+ public function searchcustompolicyAction()
+ {
+ return $this->searchBase('custom_policy', array('name', 'operator', 'value', 'action'));
+ }
+
+ public function getcustompolicyAction($uuid = null)
+ {
+ $this->sessionClose();
+ return $this->getBase('custompolicy', 'custom_policy', $uuid);
+ }
+
+ public function addcustompolicyAction()
+ {
+ return $this->addBase('custompolicy', 'custom_policy');
+ }
+
+ public function delcustompolicyAction($uuid)
+ {
+ return $this->delBase('custom_policy', $uuid);
+ }
+
+ public function setcustompolicyAction($uuid)
+ {
+ return $this->setBase('custompolicy', 'custom_policy', $uuid);
+ }
+
+ // http server
+ public function searchhttpserverAction()
+ {
+ return $this->searchBase('http_server', array('servername', 'https_only', 'certificate', 'listen_http_port', 'listen_https_port'));
+ }
+
+ public function gethttpserverAction($uuid = null)
+ {
+ $this->sessionClose();
+ return $this->getBase('httpserver', 'http_server', $uuid);
+ }
+
+ public function addhttpserverAction()
+ {
+ return $this->addBase('httpserver', 'http_server');
+ }
+
+ public function delhttpserverAction($uuid)
+ {
+ return $this->delBase('http_server', $uuid);
+ }
+
+ public function sethttpserverAction($uuid)
+ {
+ return $this->setBase('httpserver', 'http_server', $uuid);
+ }
+
+ // naxsi rules
+ public function searchnaxsiruleAction()
+ {
+ return $this->searchBase('naxsi_rule', array('description', 'ruletype', 'message'));
+ }
+
+ public function getnaxsiruleAction($uuid = null)
+ {
+ $this->sessionClose();
+ return $this->getBase('naxsi_rule', 'naxsi_rule', $uuid);
+ }
+
+ public function addnaxsiruleAction()
+ {
+ return $this->addBase('naxsi_rule', 'naxsi_rule');
+ }
+
+ public function delnaxsiruleAction($uuid)
+ {
+ return $this->delBase('naxsi_rule', $uuid);
+ }
+
+ public function setnaxsiruleAction($uuid)
+ {
+ return $this->setBase('naxsi_rule', 'naxsi_rule', $uuid);
+ }
+
+ // http url rewriting
+ public function searchhttprewriteAction()
+ {
+ return $this->searchBase('http_rewrite', array('description', 'source', 'destination', 'flag'));
+ }
+
+ public function gethttprewriteAction($uuid = null)
+ {
+ $this->sessionClose();
+ return $this->getBase('httprewrite', 'http_rewrite', $uuid);
+ }
+
+ public function addhttprewriteAction()
+ {
+ return $this->addBase('httprewrite', 'http_rewrite');
+ }
+
+ public function delhttprewriteAction($uuid)
+ {
+ return $this->delBase('http_rewrite', $uuid);
+ }
+
+ public function sethttprewriteAction($uuid)
+ {
+ return $this->setBase('httprewrite', 'http_rewrite', $uuid);
+ }
+}
diff --git a/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/IndexController.php b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/IndexController.php
new file mode 100644
index 000000000..d6a445284
--- /dev/null
+++ b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/IndexController.php
@@ -0,0 +1,54 @@
+view->settings = $this->getForm("settings");
+ $this->view->upstream_server = $this->getForm("upstream_server");
+ $this->view->upstream = $this->getForm("upstream");
+ $this->view->location = $this->getForm("location");
+ $this->view->credential = $this->getForm("credential");
+ $this->view->userlist = $this->getForm("userlist");
+ $this->view->httpserver = $this->getForm("httpserver");
+ $this->view->httprewrite = $this->getForm("httprewrite");
+ $this->view->naxsi_rule = $this->getForm("naxsi_rule");
+ $this->view->naxsi_custom_policy = $this->getForm("naxsi_custom_policy");
+ $this->view->pick('OPNsense/Nginx/index');
+ }
+}
diff --git a/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/credential.xml b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/credential.xml
new file mode 100644
index 000000000..a014c5708
--- /dev/null
+++ b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/credential.xml
@@ -0,0 +1,12 @@
+
diff --git a/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/httprewrite.xml b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/httprewrite.xml
new file mode 100644
index 000000000..eda6fc20c
--- /dev/null
+++ b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/httprewrite.xml
@@ -0,0 +1,27 @@
+
diff --git a/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/httpserver.xml b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/httpserver.xml
new file mode 100644
index 000000000..1a455d735
--- /dev/null
+++ b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/httpserver.xml
@@ -0,0 +1,92 @@
+
diff --git a/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/location.xml b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/location.xml
new file mode 100644
index 000000000..cc41d9c8a
--- /dev/null
+++ b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/location.xml
@@ -0,0 +1,106 @@
+
diff --git a/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/naxsi_custom_policy.xml b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/naxsi_custom_policy.xml
new file mode 100644
index 000000000..f19224893
--- /dev/null
+++ b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/naxsi_custom_policy.xml
@@ -0,0 +1,31 @@
+
\ No newline at end of file
diff --git a/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/naxsi_rule.xml b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/naxsi_rule.xml
new file mode 100644
index 000000000..cdaec08a4
--- /dev/null
+++ b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/naxsi_rule.xml
@@ -0,0 +1,110 @@
+
diff --git a/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/settings.xml b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/settings.xml
new file mode 100644
index 000000000..94100b302
--- /dev/null
+++ b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/settings.xml
@@ -0,0 +1,61 @@
+
diff --git a/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/upstream.xml b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/upstream.xml
new file mode 100644
index 000000000..4b8092077
--- /dev/null
+++ b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/upstream.xml
@@ -0,0 +1,13 @@
+
diff --git a/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/upstream_server.xml b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/upstream_server.xml
new file mode 100644
index 000000000..655ad6c3d
--- /dev/null
+++ b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/upstream_server.xml
@@ -0,0 +1,42 @@
+
diff --git a/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/userlist.xml b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/userlist.xml
new file mode 100644
index 000000000..32dc6d074
--- /dev/null
+++ b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/userlist.xml
@@ -0,0 +1,12 @@
+
diff --git a/www/nginx/src/opnsense/mvc/app/models/OPNsense/Nginx/ACL/ACL.xml b/www/nginx/src/opnsense/mvc/app/models/OPNsense/Nginx/ACL/ACL.xml
new file mode 100644
index 000000000..8793dd4bd
--- /dev/null
+++ b/www/nginx/src/opnsense/mvc/app/models/OPNsense/Nginx/ACL/ACL.xml
@@ -0,0 +1,9 @@
+
+
+ nginx
+
+ ui/nginx/*
+ api/nginx/*
+
+
+
diff --git a/www/nginx/src/opnsense/mvc/app/models/OPNsense/Nginx/Menu/Menu.xml b/www/nginx/src/opnsense/mvc/app/models/OPNsense/Nginx/Menu/Menu.xml
new file mode 100644
index 000000000..3c4c31b12
--- /dev/null
+++ b/www/nginx/src/opnsense/mvc/app/models/OPNsense/Nginx/Menu/Menu.xml
@@ -0,0 +1,5 @@
+
diff --git a/www/nginx/src/opnsense/mvc/app/models/OPNsense/Nginx/Nginx.php b/www/nginx/src/opnsense/mvc/app/models/OPNsense/Nginx/Nginx.php
new file mode 100644
index 000000000..cfed5580e
--- /dev/null
+++ b/www/nginx/src/opnsense/mvc/app/models/OPNsense/Nginx/Nginx.php
@@ -0,0 +1,34 @@
+
+ //OPNsense/Nginx
+ nginx web server, reverse proxy and waf
+
+
+
+ 0
+ Y
+
+
+
+
+
+ 0
+ Y
+
+
+
+
+
+ 0
+ N
+
+
+ 60
+ N
+
+
+ N
+
+
+
+
+
+ Y
+
+
+
+
+ OPNsense.Nginx.Nginx
+ credential
+ username
+
+
+ Selected user not found
+ Y
+ Y
+
+
+
+
+
+ Y
+
+
+ Y
+
+
+
+
+
+ Y
+
+
+
+
+ OPNsense.Nginx.Nginx
+ upstream_server
+ description
+
+
+ Selected server not found
+ Y
+ Y
+
+
+
+
+
+ Y
+
+
+ Y
+
+
+ Y
+
+
+ 0
+ Y
+
+
+ N
+
+
+ N
+
+
+ N
+
+
+
+ Permanently Unreachable
+ Backup Server
+
+ N
+
+
+
+
+
+ Y
+
+
+ Y
+
+
+
+ Exact Match ("=")
+ Case Sensitive Match ("~")
+ Case Insensitive Match ("~*")
+ Don't check regular expressions on logest prefix match ("^~")
+
+ N
+
+
+ 0
+ Y
+
+
+ 0
+ Y
+
+
+ N
+
+
+ N
+
+
+
+
+ OPNsense.Nginx.Nginx
+ custom_policy
+ name
+
+
+ Selected server not found
+ N
+ Y
+
+
+
+
+ OPNsense.Nginx.Nginx
+ upstream
+ description
+
+
+ Selected upstream not found
+ N
+ N
+
+
+ N
+
+
+
+
+ OPNsense.Nginx.Nginx
+ http_rewrite
+ description
+
+
+ Selected rewrite(s) not found
+ N
+ Y
+
+
+ N
+
+
+ N
+
+
+ N
+
+
+
+
+ OPNsense.Nginx.Nginx
+ userlist
+ name
+
+
+ Selected server not found
+ N
+ Y
+
+
+ 0
+ Y
+
+
+ N
+
+
+
+
+
+ Y
+
+
+
+
+ OPNsense.Nginx.Nginx
+ naxsi_rule
+ description
+
+
+ Selected rule not found
+ Y
+ Y
+
+
+ Y
+
+
+ Y
+ >=
+
+ Bigger or Equal
+ Bigger
+ Lesser
+ Lesser or Equal
+ Equal
+
+
+
+ Y
+ BLOCK
+
+ Block Request
+ Allow Request
+ Drop The Connection
+ Log Request
+
+
+
+
+
+
+ Y
+
+
+
+ Main Rule
+ Basic Rule
+
+ Y
+
+
+ Y
+ /^[^"]+$/
+
+
+ Y
+ 1000
+
+
+ N
+ /^[^"]+$/
+
+
+ N
+ /^[^"]+$/
+
+
+ Y
+ /^[^"]+$/
+
+
+ Y
+ id
+
+ Blacklist
+ Whitelist
+
+
+
+ Y
+
+
+ Y
+ 8
+
+
+ Y
+
+
+ Y
+
+
+ Y
+
+
+ /^[^"]+$/
+
+
+ /^[^"]+$/
+
+
+ /^[^"]+$/
+
+
+ Y
+
+
+ Y
+
+
+ Y
+
+
+
+
+
+ Y
+
+
+ N
+ 80
+
+
+ N
+ 443
+
+
+
+
+ OPNsense.Nginx.Nginx
+ location
+ description
+
+
+ Selected location(s) not found
+ N
+ Y
+
+
+
+
+ OPNsense.Nginx.Nginx
+ http_rewrite
+ description
+
+
+ Selected rewrite(s) not found
+ N
+ Y
+
+
+ N
+
+
+ cert
+ N
+
+
+ ca
+ N
+
+
+ Off
+
+ Off
+ On
+ Optional
+ Optional, don't verify
+
+ Y
+
+
+ main
+
+ Default
+ Anonymized
+ Disabled
+
+ Y
+
+
+ Y
+ 1
+
+
+ utf-8
+
+ utf-8
+
+ N
+
+
+ 0
+ Y
+
+
+ 0
+ Y
+
+
+ 0
+ Y
+
+
+ 1
+ Y
+
+
+
+
+
+ Y
+ /^[^" \t]+$/i
+
+
+ Y
+
+
+ Y
+ /^[^" \t]+$/i
+
+
+
+ Stop processing rules
+ Stop processing rules and find location
+ Redirect
+ Permanent
+
+ N
+
+
+
+
+
diff --git a/www/nginx/src/opnsense/mvc/app/views/OPNsense/Nginx/index.volt b/www/nginx/src/opnsense/mvc/app/views/OPNsense/Nginx/index.volt
new file mode 100644
index 000000000..054098de5
--- /dev/null
+++ b/www/nginx/src/opnsense/mvc/app/views/OPNsense/Nginx/index.volt
@@ -0,0 +1,383 @@
+{#
+ # Copyright (C) 2017-2018 Fabian Franz
+ # Copyright (C) 2014-2015 Deciso B.V.
+ # All rights reserved.
+ #
+ # Redistribution and use in source and binary forms, with or without
+ # modification, are permitted provided that the following conditions are met:
+ #
+ # 1. Redistributions of source code must retain the above copyright notice,
+ # this list of conditions and the following disclaimer.
+ #
+ # 2. Redistributions in binary form must reproduce the above copyright
+ # notice, this list of conditions and the following disclaimer in the
+ # documentation and/or other materials provided with the distribution.
+ #
+ # THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ # AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ # AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ # OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ # POSSIBILITY OF SUCH DAMAGE.
+ #}
+
+
+
+
+