# Apache (XAMPP) — ρυθμίσεις φακέλου backEnd.

# Κρύψε αρχεία config/lib/sql από άμεση πρόσβαση μέσω browser (μόνο τα api/* εκτίθενται).
<FilesMatch "\.(sql)$">
  Require all denied
</FilesMatch>

# --- 2026-08-16: ΤΟ Authorization HEADER ΠΡΕΠΕΙ ΝΑ ΦΤΑΣΕΙ ΣΤΗΝ PHP ------------
# Ο Apache ΔΕΝ προωθεί το `Authorization` header όταν η PHP τρέχει ως CGI/FastCGI/LSAPI
# (δηλαδή σχεδόν κάθε cPanel) — το κόβει σκόπιμα, γιατί μπορεί να περιέχει credentials.
#
# ΤΙ ΕΣΠΑΓΕ (μετρήθηκε ζωντανά στο api.snako.gr): αίτημα με `Bearer <token>` -> **401**,
# ενώ το ΙΔΙΟ token μέσω cookie περνούσε κανονικά. Το web δεν το είδε ποτέ επειδή
# χρησιμοποιεί το httpOnly cookie — αλλά η **εφαρμογή κινητού (React Native) στέλνει
# ΜΟΝΟ Bearer**, άρα δεν θα μπορούσε να συνδεθεί σε τίποτα. Το ίδιο και κάθε εξωτερική
# ενσωμάτωση.
#
# ⚠️ Το `bearer_token()` (lib/auth_guard.php) έχει ήδη 3 fallback — και τα ΤΡΙΑ
# αποτυγχάνουν εδώ, γιατί το header δεν φτάνει καν στο περιβάλλον της PHP. Η διόρθωση
# ΠΡΕΠΕΙ να γίνει σε επίπεδο Apache· δεν λύνεται με κώδικα.
#
# ⚠️⚠️ ΜΗΝ βάλεις `CGIPassAuth On` χωρίς περιτύλιγμα: υπάρχει μόνο από Apache 2.4.13+
# και σε παλιότερο ρίχνει **ΟΛΟ το site σε 500** (ακριβώς η παγίδα του php_flag).
# Τα δύο παρακάτω είναι ισοδύναμα, με guard, και δουλεύουν παντού.
<IfModule mod_setenvif.c>
  SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
</IfModule>

<IfModule mod_rewrite.c>
  RewriteEngine On

  # Δεύτερος δρόμος για το ίδιο (όταν λείπει το mod_setenvif).
  RewriteCond %{HTTP:Authorization} .
  RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

  # Μπλόκαρε άμεση πρόσβαση στους εσωτερικούς φακέλους.
  #
  # ⚠️⚠️ 2026-08-13 — ΕΓΙΝΕ ΚΡΙΣΙΜΟ ΓΙΑ ΤΗΝ ΠΑΡΑΓΩΓΗ: στον server ο υποτομέας
  # `api.snako.gr` δείχνει ΜΕΣΑ σε αυτόν τον φάκελο. Δηλαδή χωρίς αυτή τη γραμμή το
  # `https://api.snako.gr/tools/check-orders.php` θα ήταν **δημόσιο**: οποιοσδήποτε θα
  # μπορούσε να αδειάσει την ουρά email, να ξεκινήσει mysqldump ή να στείλει ειδοποιήσεις.
  # Κανένα tool δεν ελέγχει ότι τρέχει από γραμμή εντολών (σκάνε σε TypeError επειδή
  # λείπει το $argv — τυχαία άμυνα, όχι σχεδιασμένη). Εδώ κλείνει η πόρτα.
  # Ανοιχτά μένουν ΜΟΝΟ: api/ (το API) και uploads/ (οι εικόνες).
  RewriteRule ^(config|lib|tools|tests|db|logs|data|vendor)/ - [F]
</IfModule>

# --- 2026-08-13: keep PHP startup noise OUT of the HTTP response -------------
# A "PHP Request Startup" warning (e.g. POST larger than post_max_size) is printed
# BEFORE any of our code runs. That flushes the headers, so bootstrap.php can no
# longer set 413 and the client got HTTP 200 with HTML glued in front of the JSON.
# Errors are still LOGGED (log_errors=1) - they just stop corrupting responses.
# Lives here (not only php.ini) so it travels with the code to cPanel on go-live.
#
# !! MUST STAY WRAPPED IN <IfModule> !!
# php_flag only exists when PHP runs as an Apache module (mod_php - that is XAMPP).
# Most cPanel hosts run PHP as FPM/CGI, where a bare php_flag is a FATAL config
# error -> the whole site answers HTTP 500. Wrapped, it is simply ignored there,
# and the .user.ini next to this file covers the FPM/CGI case instead.
<IfModule mod_php.c>
  php_flag display_startup_errors off
</IfModule>
<IfModule mod_php7.c>
  php_flag display_startup_errors off
</IfModule>
<IfModule mod_php5.c>
  php_flag display_startup_errors off
</IfModule>

# --- 2026-09-27: HSTS ΚΑΙ ΣΤΟ API (εύρημα της σάρωσης ZAP) ------------------------
# Το snako.gr έστελνε ήδη HSTS (από το next.config.ts)· το api.snako.gr ΟΧΙ. Λέει στον
# browser «εδώ μόνο https, για 2 χρόνια», οπότε ένα ψεύτικο Wi-Fi δεν μπορεί να τον
# ρίξει σε http για να διαβάσει το cookie σύνδεσης ή τις παραγγελίες.
# • Ισχύει για ΟΛΑ κάτω από εδώ (api/ ΚΑΙ uploads/) — γι' αυτό μπαίνει στη ρίζα.
# • Σε http (XAMPP) οι browsers το αγνοούν εξ ορισμού — δεν πειράζει την ανάπτυξη.
# • `always` = και στις απαντήσεις σφάλματος (401/404/500), όχι μόνο στις 200.
# • ΧΩΡΙΣ `preload` εδώ: το snako.gr το δηλώνει ήδη με includeSubDomains, και το preload
#   μπαίνει μόνο από το κύριο domain.
# Και το X-Powered-By (π.χ. «PHP/8.2.12») φεύγει: δεν λέμε σε κανέναν ποια έκδοση τρέχουμε.
<IfModule mod_headers.c>
  Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
  Header always unset X-Powered-By
  Header unset X-Powered-By
</IfModule>
