# public/.htaccess — baza din șablon (§12.7) plus blocul proiectului („# BEGIN project … # END project”, mai jos),
# pe care șablonul nu îl atinge niciodată. La fiecare deploy, activate.sh (pm:htaccess:merge) adaugă la sfârșit
# blocurile scrise de cPanel în .htaccess-ul activ (MultiPHP) și, dacă deploy.conf îl cere, basic auth la început.
# Artefactul e identic pe staging și în producție: ce diferă între site-uri se decide după Host sau pe server.

<IfModule mod_negotiation.c>
    Options -MultiViews
</IfModule>
Options -Indexes

<IfModule mod_mime.c>
    AddType text/calendar .ics
    AddType font/woff2 .woff2
    AddType image/avif .avif
    AddType image/webp .webp
    AddType application/manifest+json .webmanifest
</IfModule>

<IfModule mod_headers.c>
    Header always set X-Content-Type-Options "nosniff"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set Permissions-Policy "accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()"
    # Versiunea PHP nu se anunță (scanarea ZAP din p7.md WP18): pe cPanel expose_php e adesea pornit.
    Header always unset X-Powered-By
    Header unset X-Powered-By
    # HSTS se adaugă după ce HTTPS e verificat pe domeniul final (§12.7), în blocul proiectului.

    # Site-urile de dezvoltare *.projectmedia.ro (fără domeniul principal și www): noindex pe ORICE răspuns,
    # inclusiv media și resursele statice servite direct de Apache (§12.11). Antetul trimis de PHP pe aceleași
    # răspunsuri se scoate, ca să nu apară de două ori.
    Header unset X-Robots-Tag "expr=%{HTTP_HOST} =~ m#\.projectmedia\.ro(:[0-9]+)?$#i && %{HTTP_HOST} !~ m#^www\.projectmedia\.ro(:[0-9]+)?$#i"
    Header always set X-Robots-Tag "noindex, nofollow" "expr=%{HTTP_HOST} =~ m#\.projectmedia\.ro(:[0-9]+)?$#i && %{HTTP_HOST} !~ m#^www\.projectmedia\.ro(:[0-9]+)?$#i"

    # Resursele fără hash (favicon, media): o săptămână. public/build/.htaccess le dă pe cele hash-uite un an. Cele cu
    # versiunea în adresă (`?v=`: Filament după versiunea pachetului, scripturile PM după amprenta conținutului,
    # HashedJs) se schimbă odată cu fișierul, deci primesc tot un an, imutabile.
    <FilesMatch "\.(?i:css|js|mjs|png|jpe?g|gif|webp|avif|svg|ico|woff2?|ttf|otf)$">
        Header set Cache-Control "public, max-age=604800"
        Header set Cache-Control "public, max-age=31536000, immutable" "expr=%{QUERY_STRING} =~ /(^|&)v=[^&]/"
    </FilesMatch>
</IfModule>

<IfModule mod_brotli.c>
    AddOutputFilterByType BROTLI_COMPRESS text/html text/plain text/css text/javascript application/javascript application/json application/xml image/svg+xml text/calendar application/manifest+json
</IfModule>
<IfModule !mod_brotli.c>
    <IfModule mod_deflate.c>
        AddOutputFilterByType DEFLATE text/html text/plain text/css text/javascript application/javascript application/json application/xml image/svg+xml text/calendar application/manifest+json
    </IfModule>
</IfModule>

<IfModule mod_rewrite.c>
    RewriteEngine On

    # Fișierele-punct (.env, .git, .user.ini…) nu se servesc niciodată; .well-known rămâne pentru AutoSSL/ACME.
    RewriteRule (^|/)\.(?!well-known(/|$)) - [F,L]

    # Extensii care nu au ce căuta pe web. Manifestele Vite (.json) le citește PHP de pe disc, nu browserul.
    # Excepție: documentele .xlsx publicate din biblioteca media (pm-media le acceptă), la URL-urile discului `media`.
    RewriteCond %{REQUEST_URI} !^/(storage/media|uploads)/.+\.xlsx$ [NC]
    RewriteRule \.(sql|zip|tar|gz|bak|log|ini|env|json|xlsx|p12|key)$ - [F,L,NC]

    # Scanerele fără PHP: niciun alt .php în afară de front controller, nicio cale WordPress, vendor sau .git.
    RewriteRule ^(?!index\.php$).+\.php$ - [F,L,NC]
    RewriteRule ^(wp-(admin|content|includes|login)|xmlrpc|cgi-bin|vendor|\.git)(/|$) - [F,L,NC]

    # HTTPS (301). Fără buclă în spatele unui proxy TLS; .well-known rămâne pe HTTP pentru validarea AutoSSL.
    # Host-ul canonic (www sau fără) îl impune aplicația (CanonicalHost), nu șablonul.
    RewriteCond %{HTTPS} !=on
    RewriteCond %{HTTP:X-Forwarded-Proto} !=https
    RewriteCond %{REQUEST_URI} !^/\.well-known/
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>

# BEGIN project
# Regulile proiectului (de exemplu redirecturile site-ului vechi). Stau înaintea front controller-ului, deci
# RewriteRule-urile de aici se aplică. Șablonul nu modifică niciodată acest bloc.
# END project

# Paginile din cache servite fără PHP (p7.md WP18, D113): fișierul scris de aplicație în pm-static/<domeniu>/<cale>,
# doar pentru GET sau HEAD fără query, pe căile fără / final (HTTPS e deja impus mai sus). Antetele lor stau în
# pm-static/.htaccess.
<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_METHOD} ^(GET|HEAD)$
    RewriteCond %{QUERY_STRING} ^$
    RewriteCond %{REQUEST_URI} ^(/|(/[A-Za-z0-9_~-][A-Za-z0-9._~-]*)+)$
    RewriteCond %{CONTEXT_DOCUMENT_ROOT}/pm-static/%{HTTP_HOST}%{REQUEST_URI}/index.html -f
    RewriteRule ^ pm-static/%{HTTP_HOST}%{REQUEST_URI}/index.html [L]
</IfModule>

<IfModule mod_rewrite.c>
    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Handle X-XSRF-Token Header
    RewriteCond %{HTTP:x-xsrf-token} .
    RewriteRule .* - [E=HTTP_X_XSRF_TOKEN:%{HTTP:X-XSRF-Token}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>
