# Pi-hole: A black hole for Internet advertisements
# (c) 2017 Pi-hole, LLC (https://pi-hole.net)
# Network-wide ad blocking via your own hardware.
#
# Lighttpd config for Pi-hole
#
# This file is copyright under the latest version of the EUPL.
# Please see LICENSE file for your rights under this license.

###############################################################################
#     FILE AUTOMATICALLY OVERWRITTEN BY PI-HOLE INSTALL/UPDATE PROCEDURE.     #
# ANY CHANGES MADE TO THIS FILE AFTER INSTALL WILL BE LOST ON THE NEXT UPDATE #
#                                                                             #
#              CHANGES SHOULD BE MADE IN A SEPARATE CONFIG FILE:              #
#                         /etc/lighttpd/external.conf                         #
###############################################################################

server.modules = (
    "mod_access",
    "mod_accesslog",
    "mod_auth",
    "mod_deflate",
    "mod_expire",
    "mod_redirect",
    "mod_setenv",
    "mod_rewrite"
)

server.document-root        = "/var/www/html"
server.error-handler-404    = "/pihole/index.php"
server.upload-dirs          = ( "/var/cache/lighttpd/uploads" )
server.errorlog             = "/var/log/lighttpd/error.log"
server.pid-file             = "/run/lighttpd.pid"
server.username             = "www-data"
server.groupname            = "www-data"
server.port                 = 80
accesslog.filename          = "/var/log/lighttpd/access.log"
accesslog.format            = "%{%s}t|%V|%r|%s|%b"

index-file.names            = ( "index.php", "index.html", "index.lighttpd.html" )
url.access-deny             = ( "~", ".inc", ".md", ".yml", ".ini" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

#deflate.mimetypes = ("text/")       # prefix matches all text/* Content-Type responses
deflate.mimetypes  = (
    "application/json",
    "application/vnd.ms-fontobject",
    "application/xml",
    "font/eot",
    "font/opentype",
    "font/otf",
    "font/ttf",
    "image/bmp",
    "image/svg+xml",
    "image/vnd.microsoft.icon",
    "image/x-icon",
    "text/css",
    "text/html",
    "text/javascript",
    "text/plain",
    "text/xml"
)

deflate.allowed-encodings = ( "br", "gzip", "deflate" ) # "bzip2" and "zstd" also supported

## optional

deflate.cache-dir  = "/var/cache/lighttpd/compress/"

#deflate.max-compress-size = 131072   # measured in kilobytes, so 131072 indicates 128 MB
#deflate.min-compress-size = 256      # measured in bytes
#deflate.max-loadavg = "3.50" 

#deflate.params = (                   # since lighttpd 1.4.60 (recommended: leave defaults unless you test your changes for positive effect)
#  "BROTLI_PARAM_QUALITY"    => 4,    #  0..11 (default is  4 (not 11 (BROTLI_DEFAULT_QUALITY) due to time costs of BROTLI_DEFAULT_QUALITY))
#  "BROTLI_PARAM_LGWIN"      => 22,   # 10..24 (default is 22 (BROTLI_DEFAULT_WINDOW))
#  "BROTLI_PARAM_MODE"       => 0,    #  0..2  (default is  0 (BROTLI_MODE_GENERIC)) (1: BROTLI_MODE_TEXT) (2: BROTLI_MODE_FONT)
#  "ZSTD_c_compressionLevel" => 3,    # -3..22 (default is  3 (ZSTD_CLEVEL_DEFAULT)
#  "ZSTD_c_strategy"         => 0,    #  1..9  (default is  0 (use zstd default strategy))
#  "ZSTD_c_windowLog"        => 0,    # 10..31 (default is  0 (use zstd default windowLog))
#  "gzip.level"              => 6,    #  1..9  (default is  6 (Z_DEFAULT_COMPRESSION))
#  "gzip.windowBits"         => 6,    #  9..15 (default is 15 (MAX_WBITS))
#  "gzip.memLevel"           => 8,    #  1..9  (default is  8 )
#  "gzip.strategy"           => 0,    #  0..4  (default is  0 (Z_DEFAULT_STRATEGY)) (1: Z_FILTERED 2: Z_HUFFMAN_ONLY 3: Z_RLE 4: Z_FIXED)
#  "bzip2.blockSize100k"     => 9,    #  1..9  (default is  9 (block size 900k))
#)

#deflate.compression-level = 9        # deprecated; overloaded; use deflate.params (since 1.4.60) for encoder-specific values)
#deflate.work-block-size = 2048       # deprecated; gzip-specific; currently has no effect (unused) in code
#deflate.output-buffer-size = 8192    # deprecated; gzip- and bzip2-specific; currently has little effect in code (due to mod_deflate not streaming partial responses)



mimetype.assign = (
    ".ico"   => "image/x-icon",
    ".jpeg"  => "image/jpeg",
    ".jpg"   => "image/jpeg",
    ".png"   => "image/png",
    ".svg"   => "image/svg+xml",
    ".css"   => "text/css; charset=utf-8",
    ".html"  => "text/html; charset=utf-8",
    ".js"    => "text/javascript; charset=utf-8",
    ".json"  => "application/json; charset=utf-8",
    ".map"   => "application/json; charset=utf-8",
    ".txt"   => "text/plain; charset=utf-8",
    ".eot"   => "application/vnd.ms-fontobject",
    ".otf"   => "font/otf",
    ".ttc"   => "font/collection",
    ".ttf"   => "font/ttf",
    ".woff"  => "font/woff",
    ".woff2" => "font/woff2"
)

# Add user chosen options held in external file
# This uses include_shell instead of an include wildcard for compatibility
include_shell "cat external.conf 2>/dev/null"

# default listening port for IPv6 falls back to the IPv4 port
include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port

# Prevent Lighttpd from enabling Let's Encrypt SSL for every blocked domain
#include_shell "/usr/share/lighttpd/include-conf-enabled.pl"
include_shell "find /etc/lighttpd/conf-enabled -name '*.conf' -a ! -name 'letsencrypt.conf' -printf 'include \"%p\"\n' 2>/dev/null"

# If the URL starts with /admin, it is the Web interface
$HTTP["url"] =~ "^/admin/" {
    # Create a response header for debugging using curl -I
    setenv.add-response-header = (
        "X-Pi-hole" => "The Pi-hole Web interface is working!",
        "X-Frame-Options" => "DENY"
    )

    $HTTP["url"] =~ "\.(eot|otf|tt[cf]|woff2?)$" {
        # Allow Block Page access to local fonts
        setenv.add-response-header = ( "Access-Control-Allow-Origin" => "*" )
    }
}

# Block . files from being served, such as .git, .github, .gitignore
$HTTP["url"] =~ "^/admin/\.(.*)" {
    url.access-deny = ("")
}

# Default expire header
expire.url = ( "" => "access plus 0 seconds" )
