# Sigurno konfigurirati Apache za PHP

> Sigurna Apache konfiguracija za PHP: PHP-FPM preko mod_proxy_fcgi, AllowOverride None, ServerTokens, TraceEnable i LimitRequestBody pravilno postaviti i provjeriti.

Izvor: https://phpsos.de/hr/blog/apache-fuer-php-absichern/  
Stanje: 25.10.2026  
Pružatelj: PHP SOS, PHP hitna pomoć i sigurnost poslužitelja. Hitna pomoć putem WhatsAppa: https://wa.me/491736494914?text=Pozdrav%20PHP%20SOS%2C%20trebamo%20pomo%C4%87%20s%20na%C5%A1im%20PHP%20poslu%C5%BEiteljem.%20Tvrtka%3A%20%E2%80%A6%20Web-stranica%3A%20%E2%80%A6

**Ukratko:** Da biste Apache za PHP konfigurirali sigurno, PHP povežite putem PHP-FPM-a i `mod_proxy_fcgi`, isključite `.htaccess` pomoću `AllowOverride None` i postavite `ServerTokens Prod`, `ServerSignature Off`, `TraceEnable Off` i `Options -Indexes`. `LimitRequestBody` prilagodite PHP granicama, a nepotrebne module isključite. Konfiguracija ne zamjenjuje PHP ažuriranje, ali znatno smanjuje napadnu površinu.

## Apache nakon PHP2Shella: više od ponovnog pokretanja

Operateri Apachea u listopadu 2026. bili su pod osobitim pritiskom. PHP tim rizik kod mod_php-a ocjenjuje najvišim jer je tamo pokazan exploit prije nego što se uopće izvrši kod aplikacije. Akutne korake, dakle zakrpanje i potpuno ponovno pokretanje, opisuje stranica [Zašto mod_php nosi najveći rizik](https://phpsos.de/hr/php2shell/mod-php-risiko/).

Nakon zakrpe ostaje pitanje koliko je dobra sama Apache konfiguracija. Poslužitelji koji su rasli često nose postavke iz mnogih godina: popise direktorija, otvorena `.htaccess` prava, module koje nitko više ne treba. Svaka od njih može kasniju pogrešku učiniti većom nego što bi morala biti.

Ovaj članak opisuje vitku, sigurnu osnovnu konfiguraciju za Apache 2.4 s PHP-FPM-om. Primjeri koriste Debian i Ubuntu putove; u RHEL obitelji datoteke se nalaze pod `/etc/httpd/`.

## PHP povezati putem PHP-FPM-a umjesto mod_php-a

S PHP-FPM-om PHP radi u vlastitim procesima, odvojeno od web-poslužitelja. Apache zahtjeve prosljeđuje putem `mod_proxy_fcgi`. Prema dokumentaciji Apachea povezivanje putem `SetHandler` ima prednost pred `ProxyPassMatch`: Apache zahtjev najprije sam pridruži datoteci u datotečnom sustavu, a tek zatim ga prosljeđuje PHP-FPM-u.

```apache
<FilesMatch "\.php$">
    SetHandler "proxy:unix:/run/php/seite1.sock|fcgi://localhost/"
</FilesMatch>
```

Module na Debianu i Ubuntuu uključujete naredbom `a2enmod proxy_fcgi`. Tko prelazi s mod_php-a, deaktivira PHP modul i zatim prelazi s Prefork na Event MPM. Pozadinu starog načina rada objašnjava članak [mod_php objašnjen: PHP u Apache procesu](https://phpsos.de/hr/php/mod-php-erklaert/).

Na strani PHP-FPM-a `security.limit_extensions = .php` pripada u svaki pool. Prema PHP priručniku FPM inače izvršava i `.phar` datoteke.

## Apache PHP sigurno konfigurirati: temeljne opcije

Neke postavke vrijede za cijeli poslužitelj i pripadaju u zasebnu konfiguracijsku datoteku, primjerice `/etc/apache2/conf-available/haertung.conf`, aktiviranu pomoću `a2enconf haertung`.

```apache
# Skratiti podatke o verziji (moguće samo na razini cijelog poslužitelja)
ServerTokens Prod
ServerSignature Off

# Isključiti TRACE metodu
TraceEnable Off

# Načelno ništa ne odobravati, web-stranicama dopuštati ciljano
<Directory />
    Options None
    AllowOverride None
    Require all denied
</Directory>
```

Sljedeća tablica svrstava najvažnije opcije. Zadane vrijednosti i učinak potječu iz dokumentacije Apachea.

| Direktiva | Zadano | Preporuka | Zašto |
|---|---|---|---|
| `ServerTokens` | `Full` | `Prod` | zaglavlje `Server` navodi samo „Apache“ |
| `ServerSignature` | `Off` | `Off` | bez retka s verzijom ispod stranica s pogreškama |
| `TraceEnable` | `on` | `Off` | TRACE se odbija s 405 |
| `Options` | `FollowSymlinks` | `-Indexes`, simboličke poveznice samo prema vlasniku | bez popisa direktorija |
| `AllowOverride` | `None` | `None` | `.htaccess` se ne evaluira |
| `LimitRequestBody` | 1 GiB (od 2.4.54) | prilagođeno `post_max_size` | rano odbiti velike zahtjeve |

Važno kod `AllowOverride`: mnoge distribucije i upute za CMS za web-korijen postavljaju `AllowOverride All`. Time svaka `.htaccess` datoteka može mijenjati pravila prepisivanja, handlere, a kod mod_php-a čak i PHP postavke. Napadač s pravima pisanja u mapi za prijenose može tamo odložiti vlastitu `.htaccess`. S `AllowOverride None` taj je put zatvoren.

## VirtualHost kao predložak

Sljedeći VirtualHost povezuje točke za jednu web-stranicu. Putove certifikata, socket i direktorije prilagodite. `mod_ssl` i `mod_headers` moraju biti aktivni.

```apache
<VirtualHost *:443>
    ServerName www.example.de
    DocumentRoot /var/www/seite1/public

    SSLEngine on
    SSLCertificateFile    /etc/ssl/seite1/fullchain.pem
    SSLCertificateKeyFile /etc/ssl/seite1/privkey.pem

    <Directory /var/www/seite1/public>
        Options -Indexes +SymLinksIfOwnerMatch
        AllowOverride None
        Require all granted
    </Directory>

    <FilesMatch "\.php$">
        SetHandler "proxy:unix:/run/php/seite1.sock|fcgi://localhost/"
    </FilesMatch>

    # Blokirati upravljanje verzijama i datoteke okruženja
    <DirectoryMatch "/\.(git|svn|hg)">
        Require all denied
    </DirectoryMatch>
    <FilesMatch "^\.env">
        Require all denied
    </FilesMatch>

    # 32 MiB, prilagođeno post_max_size = 32M
    LimitRequestBody 33554432

    Header unset X-Powered-By
    Header always unset X-Powered-By
</VirtualHost>
```

Dvostruki `Header unset` nije previd. Prema dokumentaciji Apachea zaglavlja iz `mod_proxy_fcgi` završavaju u drugoj internoj tablici od zaglavlja samog poslužitelja; s obje varijante obuhvaćate oba slučaja. Daljnja zaglavlja koja aktivno štite posjetitelje opisuje vodič [Sigurnosna zaglavlja za web-stranice](https://phpsos.de/hr/ratgeber/sicherheits-header/).

Mape za prijenose i predmemoriju trebaju dodatnu zabranu izvršavanja. Kako pronaći i blokirati sve zapisive mape, piše u članku [Zabraniti izvršavanje PHP-a u mapama za prijenose](https://phpsos.de/hr/blog/php-in-uploads-verbieten/).

## Počistiti module i provjeriti rezultat

Svaki učitani modul je kod koji reagira na zahtjeve. Provjerite koji su moduli aktivni i isključite što Vam ne treba. Tipični kandidati su `autoindex`, `status` bez ograničenja pristupa, `cgi` i `userdir`.

```bash
# Prikazati aktivne module
apachectl -M | sort
# Primjer Debian/Ubuntu: isključiti modul za popise direktorija
sudo a2dismod autoindex
# Provjeriti konfiguraciju i tek zatim ponovno učitati
sudo apachectl configtest && sudo systemctl reload apache2
# Test izvana: TRACE treba vratiti 405, .git 403
curl -s -o /dev/null -w "%{http_code}\n" -X TRACE https://www.example.de/
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.de/.git/HEAD
```

Osobitu pažnju zaslužuje `mod_status`. Status stranica prikazuje pokrenute zahtjeve s adresama i pozvanim putovima. Ako je potrebna, pristup ograničite pomoću `Require ip` na Vaše administrativne mreže. Isto vrijedi za status stranice PHP-FPM-a koje su učinjene dostupnima putem Apachea.

> **Važno:**
> `AllowOverride` ne mijenjajte bez pripreme. Najprije pravila iz svih `.htaccess` datoteka preuzmite u VirtualHost i web-stranicu testirajte na kopiji. Inače preusmjeravanja i lijepi URL-ovi nakon ponovnog učitavanja prestaju raditi.

Kao dodatni sloj ispred aplikacije može imati smisla vlastiti Web Application Firewall; uvod opisuje članak [Primijeniti ModSecurity i OWASP Core Rule Set](https://phpsos.de/hr/blog/modsecurity-owasp-crs/).

## Zaključak: red pobjeđuje pojedinačne mjere

Sigurna Apache konfiguracija za PHP sastoji se od nekoliko dobro shvaćenih gradivnih elemenata. PHP radi putem PHP-FPM-a odvojeno od web-poslužitelja, `.htaccess` se ne evaluira, podaci o verziji i TRACE su isključeni, granice veličine odgovaraju PHP-u, a zapisive mape ne izvršavaju skripte. Nijedna od tih točaka sama po sebi nije spektakularna. Zajedno osiguravaju da pogreška na jednom mjestu ne dovede odmah do preuzimanja poslužitelja.

Za upravu i voditelje projekata gotovo je važnije drugo svojstvo: pospremljena konfiguracija je razumljiva. Ako sva pravila stoje u VirtualHostu umjesto da su razasuta po desecima `.htaccess` datoteka, kod sljedeće kritične ranjivosti brzo se može provjeriti koja je web-stranica kako povezana. U situaciji poput one u listopadu 2026. to štedi upravo vrijeme koje je presudno.

Prijelaz ipak planirajte mirno i s testnim okruženjem. Prenagljena promjena s mod_php-a na PHP-FPM neposredno prije vikenda prije stvara nove probleme nego što ih rješava.

## Kako PHP SOS konkretno pomaže?

- **Provjeriti stanje:** čitamo cijelu Apache konfiguraciju, sve aktivne module i sve `.htaccess` datoteke.
- **Planirati prijelaz:** gdje još radi mod_php, pripremamo prelazak na PHP-FPM sa zasebnim poolovima po web-stranici.
- **Ojačati konfiguraciju:** postavljamo temeljne opcije, `.htaccess` pravila preuzimamo u VirtualHostove i blokiramo zapisive mape.
- **Testirati i dokumentirati:** nakon svake izmjene izvana provjeravamo web-stranice i bilježimo stanje u sklopu [ojačavanja poslužitelja](https://phpsos.de/hr/leistungen/server-haertung/).


## Česta pitanja

**Trebam li još koristiti mod_php?**  
Za nove postavke preporučujemo PHP-FPM putem mod_proxy_fcgi. PHP tim rizik od PHP2Shella kod mod_php-a ocjenjuje najvišim. S PHP-FPM-om PHP radi odvojeno od web-poslužitelja, sa zasebnim korisnicima po web-stranici i vlastitim granicama.

**Zašto AllowOverride None ako moj CMS treba .htaccess?**  
Datoteku .htaccess može izraditi svatko tko smije pisati u web-korijen, pa i ubačeni kod. S AllowOverride None Apache takve datoteke ne evaluira. Pravila Vašeg CMS-a tada jednokratno preuzimate u VirtualHost. To je malo truda, ali konfiguraciju čini razumljivom i bržom.

**Mogu li ServerTokens postaviti različito po web-stranici?**  
Ne. Prema dokumentaciji Apachea ServerTokens vrijedi za cijeli poslužitelj i ne može se mijenjati po VirtualHostu. Istodobno upravlja i podatkom o verziji ispod stranica s pogreškama koji prikazuje ServerSignature.

**Koju zadanu vrijednost ima LimitRequestBody?**  
Od Apachea 2.4.54 zadano je 1 GiB, u verziji 2.4.53 i starijima bio je neograničen. Vrijednost postavite prema post_max_size u Vašoj PHP konfiguraciji kako bi se preveliki zahtjevi odbijali već u web-poslužitelju.

## Izvori

- [Apache: temeljne funkcije (core)](https://httpd.apache.org/docs/2.4/mod/core.html)
- [Apache: mod_proxy_fcgi](https://httpd.apache.org/docs/2.4/mod/mod_proxy_fcgi.html)
- [Apache: mod_headers](https://httpd.apache.org/docs/2.4/mod/mod_headers.html)
- [php.net: sigurnosne obavijesti](https://www.php.net/)
