123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291 |
- <div class="standardContainer">
- <div class="ui basic segment">
- <h2>Default Site</h2>
- <p>Default routing options for inbound traffic (previously called Proxy Root)</p>
- <div class="ui form">
- <div class="grouped fields">
- <label>What to show when Zoraxy is hit with an unknown Host?</label>
- <div class="field">
- <div class="ui radio defaultsite checkbox">
- <input type="radio" name="defaultsiteOption" checked="checked" value="webserver">
- <label>Internal Static Web Server<br>
- <small>Check this if you prefer a more Apache / Nginx like experience</small>
- </label>
- </div>
- </div>
- <div class="field">
- <div class="ui radio defaultsite checkbox">
- <input type="radio" name="defaultsiteOption" value="proxy">
- <label>Reverse Proxy Target<br>
- <small>Proxy the request to a target IP / domain</small>
- </label>
- </div>
- </div>
- <div class="field">
- <div class="ui radio defaultsite checkbox">
- <input type="radio" name="defaultsiteOption" value="redirect">
- <label>Redirect<br>
- <small>Redirect the user to a new location</small>
- </label>
- </div>
- </div>
- <div class="field">
- <div class="ui radio defaultsite checkbox">
- <input type="radio" name="defaultsiteOption" value="notfound">
- <label>Show 404 NOT FOUND<br>
- <small>Respond to request with a 404 page</small>
- </label>
- </div>
- </div>
- <div class="field">
- <div class="ui radio defaultsite checkbox">
- <input type="radio" name="defaultsiteOption" value="closeresp">
- <label>Close Connection<br>
- <small>Close the connection without any response</small>
- </label>
- </div>
- </div>
- </div>
- </div>
- <!-- Reverse Proxy as Default Site Options -->
- <div id="defaultSiteProxyOptions" class="ui basic segment advanceoptions defaultSiteOptionDetails" style="display:none; ">
- <div class="ui form">
- <div class="field">
- <label>Reverse Proxy Target</label>
- <input type="text" id="proxyRoot" onchange="checkRootRequireTLS(this.value);">
- <small>e.g. localhost:8080 / 192.168.0.100:80 / example.com</small>
- </div>
- <div class="field">
- <div class="ui checkbox">
- <input type="checkbox" id="rootReqTLS">
- <label>Reverse proxy target require TLS connection <br><small>Check this if your proxy target URL require connection with https://</small></label>
- </div>
- </div>
- </div>
- </div>
-
- <!-- Redirect as default site Options-->
- <div id="defaultSiteRedirectOptions" class="ui basic segment advanceoptions defaultSiteOptionDetails" style="display:none;"">
- <div class="ui form">
- <div class="field">
- <label>Redirect target domain</label>
- <div class="ui input">
- <input id="redirectDomain" type="text" placeholder="http://example.com">
- </div>
- <small>Unset subdomain will be redirected to the link above. Remember to include the protocol (e.g. http:// or https://)</small>
- </div>
- </div>
- </div>
- <button class="ui basic button" onclick="setProxyRoot(this)"><i class="green checkmark icon" ></i> Apply Changes</button>
- <button class="ui basic button" onclick="initRootInfo()"><i class="refresh icon" ></i> Reset</button>
- <br>
- </div>
- </div>
- <script>
- var currentDefaultSiteOption = 0; //For enum see typedef.go
- $("#advanceRootSettings").accordion();
- //Handle toggle events of option radio boxes
- function updateAvaibleDefaultSiteOptions(){
- let selectedDefaultSite = $('input[name="defaultsiteOption"]:checked').val();
- $(".defaultSiteOptionDetails").hide();
- $("#useRootProxyRouterForVdir").parent().addClass("disabled");
- if (selectedDefaultSite == "webserver"){
- //Use build in web server as target
- let staticWebServerURL = "127.0.0.1:" + $("#webserv_listenPort").val();
- $("#proxyRoot").val(staticWebServerURL);
- $("#proxyRoot").parent().addClass("disabled");
- $("#rootReqTLS").parent().checkbox("set unchecked");
- $("#rootReqTLS").parent().addClass("disabled");
- $("#useRootProxyRouterForVdir").parent().removeClass("disabled");
- currentDefaultSiteOption = 0;
- }else if (selectedDefaultSite == "proxy"){
- $("#defaultSiteProxyOptions").show();
- $("#rootReqTLS").parent().removeClass("disabled");
- $("#proxyRoot").parent().removeClass("disabled");
- $("#useRootProxyRouterForVdir").parent().removeClass("disabled");
- currentDefaultSiteOption = 1;
- }else if (selectedDefaultSite == "redirect"){
- $("#defaultSiteRedirectOptions").show();
- currentDefaultSiteOption = 2;
- }else if (selectedDefaultSite == "notfound"){
- currentDefaultSiteOption = 3;
- }else if (selectedDefaultSite == "closeresp"){
- currentDefaultSiteOption = 4;
- }else{
- //Unknown option
- return;
- }
- }
- //Bind events to the radio boxes
- function bindDefaultSiteRadioCheckboxEvents(){
- $('input[type=radio][name=defaultsiteOption]').off("change").on("change", function() {
- updateAvaibleDefaultSiteOptions();
- });
- }
-
- function initRootInfo(callback=undefined){
- $.get("/api/proxy/list?type=root", function(data){
- if (data == null){
- msgbox("Default site load failed", false);
- }else{
- var $radios = $('input:radio[name=defaultsiteOption]');
- let proxyType = data.DefaultSiteOption;
- //See typedef.go for enum conversion
- if (proxyType == 0){
- $radios.filter('[value=webserver]').prop('checked', true);
- }else if (proxyType == 1){
- $radios.filter('[value=proxy]').prop('checked', true);
- $("#proxyRoot").val(data.DefaultSiteValue);
- }else if (proxyType == 2){
- $radios.filter('[value=redirect]').prop('checked', true);
- $("#redirectDomain").val(data.DefaultSiteValue);
- }else if (proxyType == 3){
- $radios.filter('[value=notfound]').prop('checked', true);
- }else if (proxyType == 4){
- $radios.filter('[value=closeresp]').prop('checked', true);
- }
- updateAvaibleDefaultSiteOptions();
-
- $("#proxyRoot").val(data.ActiveOrigins[0].OriginIpOrDomain);
- checkRootRequireTLS(data.ActiveOrigins[0].OriginIpOrDomain);
- }
- if (callback != undefined){
- callback();
- }
- });
- }
- initRootInfo(function(){
- bindDefaultSiteRadioCheckboxEvents();
- });
- function isUsingStaticWebServerAsRoot(callback){
- let currentProxyRoot = $("#proxyRoot").val().trim();
- $.get("/api/webserv/status", function(webservStatus){
- if (currentProxyRoot == "127.0.0.1:" + webservStatus.ListeningPort || currentProxyRoot == "localhost:" + webservStatus.ListeningPort){
- return callback(true);
- }
- return callback(false);
- });
-
- }
-
- //Bind event to tab switch
- tabSwitchEventBind["setroot"] = function(){
-
- }
- //Check if the given domain will redirect to https
- function checkRootRequireTLS(targetDomain){
- //Trim off the http or https from the origin
- if (targetDomain.startsWith("http://")){
- targetDomain = targetDomain.substring(7);
- $("#proxyRoot").val(targetDomain);
- }else if (targetDomain.startsWith("https://")){
- targetDomain = targetDomain.substring(8);
- $("#proxyRoot").val(targetDomain);
- }
- $.cjax({
- url: "/api/proxy/tlscheck",
- method: "POST",
- data: {url: targetDomain},
- success: function(data){
- if (data.error != undefined){
- }else if (data == "https"){
- $("#rootReqTLS").parent().checkbox("set checked");
- }else if (data == "http"){
- $("#rootReqTLS").parent().checkbox("set unchecked");
- }
- }
- })
- }
- //Set the new proxy root option
- function setProxyRoot(btn=undefined){
- var newpr = $("#proxyRoot").val();
- if (newpr.trim() == "" && currentDefaultSiteOption == 0){
- //Fill in the web server info
- newpr = "127.0.0.1:" + $("#webserv_listenPort").val();
- $("#proxyRoot").val(newpr);
-
- }
- var rootReqTls = $("#rootReqTLS")[0].checked;
- if (btn != undefined){
- $(btn).addClass("disabled");
- }
- //proxy mode or redirect mode, check for input values
- var defaultSiteValue = "";
- if (currentDefaultSiteOption == 1){
- if ($("#proxyRoot").val().trim() == ""){
- $("#proxyRoot").parent().addClass("error");
- return;
- }
- defaultSiteValue = $("#proxyRoot").val().trim();
- $("#proxyRoot").parent().removeClass("error");
- }else if (currentDefaultSiteOption == 2){
- if ($("#redirectDomain").val().trim() == ""){
- $("#redirectDomain").parent().addClass("error");
- return;
- }
- defaultSiteValue = $("#redirectDomain").val().trim();
- $("#redirectDomain").parent().removeClass("error");
- }
- //Create the endpoint by calling add
- $.cjax({
- url: "/api/proxy/add",
- data: {
- "type": "root",
- "tls": rootReqTls,
- "ep": newpr,
- "defaultSiteOpt": currentDefaultSiteOption,
- "defaultSiteVal":defaultSiteValue,
- },
- method: "POST",
- success: function(data){
- if (data.error != undefined){
- msgbox(data.error, false, 5000);
- }else{
- //OK
-
- initRootInfo(function(){
-
- //Check if WebServ is enabled
- isUsingStaticWebServerAsRoot(function(isUsingWebServ){
- if (isUsingWebServ){
- //Force enable static web server
- //See webserv.html for details
- setWebServerRunningState(true);
- }
-
- msgbox("Default Site Updated");
- })
- });
-
- }
- if (btn != undefined){
- $(btn).removeClass("disabled");
- }
- },
- error: function(){
- msgbox("Unknown error occured", false);
- }
- });
- }
- </script>
|