Bütün yazılar

LiteSpeed-də IfModule tələsi: ana səhifə açılır, qalan hər şey 404

Saytı Hostinger-ə yayımladıq. Ana səhifə açıldı, statik fayllar gəldi, PHP işlədi. Amma /projects, /blog, /admin/login — hamısı 404 verdi.

Yanlış şübhələr

İlk ağla gələn üç ehtimal: .htaccess serverə düşməyib, mod_rewrite sönülüdür, ya da qovluq quruluşu səhvdir. Üçü də ağlabatan idi. Üçü də səhv çıxdı.

Belə hallarda vaxta qənaət edən bir sual var: 404-ü kim qaytarır — veb server, yoxsa tətbiq?

Cavab başlıqlardadır:

$ curl -sSI https://bulud.tech/admin/login
HTTP/2 404
last-modified: Tue, 22 Apr 2025 07:41:12 GMT
server: LiteSpeed

last-modified bir il əvvələ aiddir. Deməli bu, tətbiqin yaratdığı səhifə deyil — LiteSpeed-in diskdəki hazır 404 faylıdır. PHP ümumiyyətlə çağırılmır.

Müqayisə üçün tətbiqin öz 404-ü belə görünürdü: content-type: text/html; charset=UTF-8, sessiya cookie-si, təhlükəsizlik başlıqları. Tamam başqa cavab.

Həlledici sübut

Əsl cavab gözlənilməz yerdən gəldi — adi bir CSS faylının başlıqlarından:

$ curl -sSI https://bulud.tech/assets/css/styles.css
HTTP/2 200
cache-control: public, max-age=604800

cache-control var. Amma x-frame-optionsx-content-type-options yoxdur — halbuki .htaccess-də ikisi də yazılmışdı.

Bu, ikisi arasındakı fərqi göstərir. Başlıqlar <IfModule mod_headers.c> blokunun içindəydi. Marşrutlaşdırma qaydaları isə <IfModule mod_rewrite.c> blokunun içində. Hər iki blok atlanırdı.

Səbəb

LiteSpeed Apache-nin .htaccess sintaksisini oxuyur, amma <IfModule> şərtini eyni şəkildə qiymətləndirmir: modul adları onun daxili reyestrində Apache-dəki kimi qeydiyyatdan keçmir. Nəticədə şərt yanlış çıxır və blok bütövlükdə görməzdən gəlinir — xəta vermədən, log-a heç nə yazmadan.

Ana səhifənin işləməsi isə təsadüf deyil: / ünvanı DirectoryIndex vasitəsilə birbaşa diskdəki index.php faylına düşür. Ona rewrite lazım deyil. Bütün virtual ünvanlar isə rewrite-dan asılıdır.

Həll

Kritik direktivləri şərt blokundan çıxarmaq:

DirectoryIndex index.php

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

RewriteRule ^ index.php [L]

<IfModule> qoruyucusu əslində modul olmayanda 500 xətasının qarşısını almaq üçündür. Amma mod_rewrite olmayan serverdə bu tip sayt onsuz da işləyə bilməz — yəni qoruyucu heç nə qorumur, sadəcə nasazlığı səssiz edir.

Nə öyrəndik

Səssiz uğursuzluq ən bahalı nasazlıq növüdür. <IfModule> bloku "modul yoxdursa dinc keç" deyir; problem odur ki, "modulu tanımıram" ilə "modul yoxdur" eyni şey deyil.

Diaqnostika üçün ən faydalı vərdiş: cavabın kimdən gəldiyini müəyyən et. Statik bir faylın başlıqları bunu bir sorğuda göstərir — çünki statik faylda PHP iştirak etmir, gördüyün hər şey serverin öz konfiqurasiyasıdır.