# Папка загрузок: здесь лежит то, что принесли посетители.
#
# Последний рубеж обороны. Движок и так проверяет тип по содержимому,
# придумывает имя сам и пересобирает картинки заново — но если всё это
# однажды обойдут, здесь ничего не должно выполниться.
#
# Файл кладётся в саму папку намеренно: блок <Directory> в .htaccess
# уровнем выше Apache не принимает и отвечает пятисоткой на весь сайт.

# Ничего не исполнять.
<IfModule mod_php.c>
    php_flag engine off
</IfModule>

<IfModule mod_php7.c>
    php_flag engine off
</IfModule>

<IfModule mod_php8.c>
    php_flag engine off
</IfModule>

# Если PHP работает не модулем, а отдельным обработчиком, флаг выше не
# сработает — снимаем сами обработчики.
RemoveHandler .php .phtml .php3 .php4 .php5 .php7 .php8 .phar .cgi .pl .py .shtml
RemoveType .php .phtml .php3 .php4 .php5 .php7 .php8 .phar

# И на всякий случай: всё, что похоже на исполняемое, отдаётся как текст.
AddType text/plain .php .phtml .php3 .php4 .php5 .php7 .php8 .phar .cgi .pl .py

# Список файлов в папке никому не нужен.
Options -Indexes -ExecCGI

<IfModule mod_headers.c>
    Header always set X-Content-Type-Options "nosniff"
    # Картинку из загрузок нельзя открывать как страницу
    Header always set Content-Security-Policy "default-src 'none'; img-src 'self'; media-src 'self'; style-src 'unsafe-inline'; sandbox"
</IfModule>

# Архивы напрямую не отдаём: их выдаёт движок (модуль загрузок) после
# проверки права на скачивание. Прямая ссылка в обход лицензии закрыта.
<FilesMatch "\.(zip|rar|7z|tar|gz|tgz|bz2)$">
    <IfModule mod_authz_core.c>
        Require all denied
    </IfModule>
    <IfModule !mod_authz_core.c>
        Order allow,deny
        Deny from all
    </IfModule>
</FilesMatch>

# Типы лёгких копий: не на всяком сервере они известны.
AddType image/avif .avif
AddType image/webp .webp

# AVIF, затем WebP вместо jpg/png тем браузерам, что их просят: рядом с картинкой лежат «foto.jpg.avif» и «foto.jpg.webp» (настройки «Картинки в WebP» и «Картинки в AVIF»,
# команда media:webp). Остальным отдаётся сама картинка. Vary: Accept — чтобы общий кэш не перепутал.
# Страницы сайта и сами ставят адреса лёгких копий (core/Media/ImageHints), так что при выключенном mod_rewrite выигрыш остаётся.
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTP_ACCEPT} image/avif
    RewriteCond %{REQUEST_FILENAME} \.(jpe?g|png)$ [NC]
    RewriteCond %{REQUEST_FILENAME}.avif -f
    RewriteRule ^(.+)$ $1.avif [T=image/avif,L]
    RewriteCond %{HTTP_ACCEPT} image/webp
    RewriteCond %{REQUEST_FILENAME} \.(jpe?g|png)$ [NC]
    RewriteCond %{REQUEST_FILENAME}.webp -f
    RewriteRule ^(.+)$ $1.webp [T=image/webp,L]
</IfModule>
<IfModule mod_headers.c>
    <FilesMatch "\.(jpe?g|png)$">
        Header append Vary Accept
    </FilesMatch>
</IfModule>
