{{$v := Get `values`}} {{$v.Get "domain"}} { {{$root := $v.Get "root"}} {{if $root}} root "{{$root|$v.AddSlashes|ToHTML}}" {{end}} {{if eq ($v.Get "basicauth") "1"}} basicauth "{{$v.GetAttrVal "basicauth" "username"|$v.AddSlashes}}" "{{$v.GetAttrVal "basicauth" "password"|$v.AddSlashes}}" { realm "{{$v.GetAttrVal "basicauth" "realm" "Restricted"|$v.AddSlashes}}" {{$v.Iterator "basicauth" "resources" " "}} } {{end}} {{if eq ($v.Get "ratelimit") "1"}} ratelimit {{$v.GetAttrVal "ratelimit" "methods"}} {{$v.GetAttrVal "ratelimit" "rate"}} {{$v.GetAttrVal "ratelimit" "burst"}} {{$v.GetAttrVal "ratelimit" "unit"}} { {{$v.AddonAttr "ratelimit" "whitelist"}} {{$v.AddonAttr "ratelimit" "limit_by_header"}} {{$v.AddonAttr "ratelimit" "status"}} {{$v.Iterator "ratelimit" "resources" " "}} } {{end}} {{if eq ($v.Get "cors") "1"}} cors {{$v.GetAttrVal "cors" "path" "/"}} {{$v.GetAttrVal "cors" "domains"}} { {{$v.AddonAttr "cors" "origin"}} {{$v.AddonAttr "cors" "origin_regexp"}} {{$v.AddonAttr "cors" "methods"}} {{$v.AddonAttr "cors" "allow_credentials" "false"}} {{$v.AddonAttr "cors" "max_age"}} {{$v.AddonAttr "cors" "allowed_headers"}} {{$v.AddonAttr "cors" "exposed_headers"}} } {{end}} {{if eq ($v.Get "jwt") "1"}} jwt { {{$v.AddonAttr "jwt" "path" "/"}} {{$v.AddonAttr "jwt" "redirect"}} {{$v.IteratorKV "jwt" "allow" " allow "}} {{$v.IteratorKV "jwt" "deny" " deny "}} {{$v.AddonAttr "jwt" "except"}} {{$v.IteratorKV "jwt" "token_source" " token_source "}} {{$strip_header := Get "jwt" "strip_header"}} {{if $strip_header}} strip_header {{end}} {{$passthrough := Get "jwt" "passthrough"}} {{if $passthrough}} passthrough {{end}} {{$allowroot := Get "jwt" "allowroot"}} {{if $allowroot}} allowroot {{end}} {{$v.Iterator "jwt" "publickey" " publickey "}} {{$v.AddonAttr "jwt" "secret"}} } {{end}} {{if eq ($v.Get "locale") "1"}} locale {{$v.GetAttrVal "locale" "available" "en zh-CN"}} { {{$v.AddonAttr "locale" "detect" "header"}} {{$v.AddonAttr "locale" "cookie" "locale"}} {{$v.AddonAttr "locale" "available" "en zh-CN"}} {{$v.AddonAttr "locale" "path" "/"}} } {{end}} {{if eq ($v.Get "nobots") "1"}} nobots "{{$v.GetAttrVal "nobots" "bomb" "bomb.gz"|$v.AddSlashes}}" { {{$v.Iterator "nobots" "userAgent" " " true}} {{$v.Iterator "nobots" "userAgentRegexp" " regexp " true}} {{$v.Iterator "nobots" "publicPathRegexp" " public " true}} } {{end}} {{if eq ($v.Get "prometheus") "1"}} prometheus { {{$use_caddy_addr := Get "prometheus" "use_caddy_addr"}} {{if $use_caddy_addr}} use_caddy_addr {{else}} {{$v.AddonAttr "prometheus" "address" "localhost:9180"}} {{end}} {{$v.AddonAttr "prometheus" "path" "/metrics"}} {{$v.AddonAttr "prometheus" "hostname"}} {{$v.IteratorKV "header" "label" " label " true}} } {{end}} {{if eq ($v.Get "log") "1"}} log / "{{$v.Get "log_file"|$v.AddSlashes|ToHTML}}" "{{$v.Get "log_format"|Default "{combined} {latency}"|$v.AddSlashes|ToHTML}}" { {{$v.AddonAttr "log" "rotate_size"}} {{$v.AddonAttr "log" "rotate_age"}} {{$v.AddonAttr "log" "rotate_keep"}} {{if eq ($v.Get "log_rotate_compress") "1"}}rotate_compress{{end}} {{$ipv4mask := $v.Get "log_ipmask_v4"}} {{$ipv6mask := $v.Get "log_ipmask_v6"}} {{if or $ipv4mask $ipv6mask}} ipmask {{$ipv4mask}} {{$ipv6mask}} {{end}} {{$v.AddonAttr "log" "except"}} } {{end}} {{if $v.Get "index"}} index {{$v.Get "index"}} {{end}} {{if $v.Get "header_path"}} header {{$v.Get "header_path"}} { {{$v.IteratorKV "header" "" " " true}} } {{end}} {{if eq ($v.Get "tls") "1"}} {{if and ($v.Get "tls_cert") ($v.Get "tls_key")}} tls "{{$v.Get "tls_cert"|$v.AddSlashes|ToHTML}}" "{{$v.Get "tls_key"|$v.AddSlashes|ToHTML}}" {{else if $v.Get "tls_email"|ToHTML}} tls {{$v.Get "tls_email"|ToHTML}} {{end}} {{else}} tls off {{end}} {{if eq ($v.Get "gzip") "1"}} gzip { {{$v.AddonAttr "gzip" "ext"}} {{$v.AddonAttr "gzip" "not"}} {{$v.AddonAttr "gzip" "level"}} {{$v.AddonAttr "gzip" "min_length"}} } {{end}} {{if eq ($v.Get "fastcgi") "1"}} fastcgi {{$v.Get "fastcgi_path"}} {{$v.Get "fastcgi_endpoint"}} {{$v.Get "fastcgi_preset"}} { {{$v.AddonAttr "fastcgi" "ext"}} {{$v.AddonAttr "fastcgi" "split"}} {{$v.AddonAttr "fastcgi" "index"}} {{$v.IteratorKV "fastcgi" "env" " env "}} {{$v.AddonAttr "fastcgi" "root"}} {{$v.AddonAttr "fastcgi" "except"}} {{$v.AddonAttr "fastcgi" "upstream"}} {{$v.AddonAttr "fastcgi" "connect_timeout"}} {{$v.AddonAttr "fastcgi" "read_timeout"}} {{$v.AddonAttr "fastcgi" "send_timeout"}} } {{end}} {{if eq ($v.Get "proxy") "1"}} proxy {{$v.Get "proxy_from"}} {{$v.Get "proxy_to"}} { {{$v.AddonAttr "proxy" "policy"}} {{$v.AddonAttr "proxy" "fail_timeout"}} {{$v.AddonAttr "proxy" "max_fails"}} {{$v.AddonAttr "proxy" "try_duration"}} {{$v.AddonAttr "proxy" "try_interval"}} {{$v.AddonAttr "proxy" "health_check"}} {{$v.AddonAttr "proxy" "health_check_interval"}} {{$v.AddonAttr "proxy" "health_check_timeout"}} {{$v.IteratorKV "proxy" "header_upstream" " header_upstream " true}} {{$v.IteratorKV "proxy" "header_downstream" " header_downstream " true}} {{$v.AddonAttr "proxy" "keepalive"}} {{$v.AddonAttr "proxy" "without"}} {{$v.AddonAttr "proxy" "except"}} {{$v.AddonAttr "proxy" "upstream"}} {{$v.Iterator "proxy" "preset" " "}} } {{end}} {{if eq ($v.Get "browse") "1"}} browse {{$v.Get "browse_path"}} {{$v.Get "browse_tmpl"}} {{end}} {{if eq ($v.Get "expires") "1"}} expires { {{$v.IteratorKV "expires" "match" " match "}} {{$v.IteratorKV "expires" "match_header" " match_header "}} } {{end}} {{if eq ($v.Get "ipfilter") "1"}} ipfilter {{$v.Get "ipfilter_paths"}} { {{$v.AddonAttr "ipfilter" "rule"}} {{$v.AddonAttr "ipfilter" "ip"}} {{$v.AddonAttr "ipfilter" "country"}} {{$v.AddonAttr "ipfilter" "database"}} {{$v.AddonAttr "ipfilter" "blockpage"}} {{$v.AddonAttr "ipfilter" "strict"}} } {{end}} {{if eq ($v.Get "filter") "1"}} {{range $index, $searchPattern := $v.GetSlice "filter_search_pattern"}} {{$filterPath := ($v.GetSlice "filter_path").GetByIndex $index}} {{$filterContentType := ($v.GetSlice "filter_content_type").GetByIndex $index}} {{if or $filterPath $filterContentType}} filter rule { {{if $filterPath}} path "{{$filterPath|$v.AddSlashes|ToHTML}}" {{end}} {{if $filterContentType}} content_type "{{$filterContentType|$v.AddSlashes|ToHTML}}" {{end}} {{if and $filterPath $filterContentType}} path_content_type_combination "{{($v.GetSlice "filter_path_content_type_combination").GetByIndex $index|ToHTML}}" {{end}} search_pattern "{{$searchPattern|$v.AddSlashes|ToHTML}}" replacement "{{($v.GetSlice "filter_replacement").GetByIndex $index|$v.AddSlashes|ToHTML}}" } {{end}} {{end}} {{$filterMaxBufferSize := Int ($v.Get "filter_max_buffer_size")}} {{if gt $filterMaxBufferSize 0}} filter max_buffer_size {{$filterMaxBufferSize}} {{end}} {{end}} {{$v.Get "rewrite_rule"|ToHTML}} {{if eq ($v.Get "s3browser") "1"}} {{$secure := eq ($v.Get "s3browser_secure") "1"}} s3browser { {{$v.AddonAttr "s3browser" "key"}} {{$v.AddonAttr "s3browser" "secret"|ToHTML}} {{$v.AddonAttr "s3browser" "bucket"}} {{$v.AddonAttr "s3browser" "region"}} {{$v.AddonAttr "s3browser" "endpoint"}} {{$v.AddonAttr "s3browser" "prefix"}} {{$v.AddonAttr "s3browser" "cdnurl"}} secure {{if $secure}}true{{else}}false{{end}} {{$v.AddonAttr "s3browser" "refresh"}} debug {{if eq ($v.Get "s3browser_debug") "1"}}true{{else}}false{{end}} } {{$proxypath := $v.Get "s3browser_proxypath"}} {{if $proxypath}} proxy {{$proxypath}} http{{if $secure}}s{{end}}://{{$v.Get "s3browser_bucket"}}.{{$v.Get "s3browser_endpoint"}} { header_upstream Host {{$v.Get "s3browser_bucket"}}.{{$v.Get "s3browser_endpoint"}} } {{end}} {{end}} {{if eq ($v.Get "webdav") "1"}} {{$webdavRoot := $v.Get "webdav_root"|$v.AddSlashes|ToHTML}} {{$webdavURL := $v.Get "webdav_url"|$v.AddSlashes|ToHTML}} {{$webdavUsers := $v.GetWebdavUser}} {{range $key,$val := $webdavUsers}} basicauth "{{$webdavURL}}" "{{$val.User|$v.AddSlashes|ToHTML}}" "{{$val.Password|$v.AddSlashes|ToHTML}}" {{end}} webdav "{{$webdavURL}}" { scope "{{$webdavRoot}}" modify {{if eq ($v.Get "webdav_modify") "1"}}true{{else}}false{{end}} {{range $k,$perm := $v.GetWebdavGlobal}} {{$perm.String|ToHTML}} {{end}} {{range $key,$val := $webdavUsers}} {{$val.User}}: {{if $val.Root}} scope "{{$val.Root|$v.AddSlashes|ToHTML}}" {{end}} {{if $val.Writeable.Valid}} modify {{$val.Writeable.Bool}} {{end}} {{range $k,$perm := $val.Perms}} {{$perm.String|ToHTML}} {{end}} {{end}} } {{end}} }