Məzmuna keç
Server və .htaccess

WordPress Yazıları 404 Qaytarır, Ana Səhifə İsə İşləyir

Ana səhifəniz normal açılır, amma hər bir yazı və səhifə 404 qaytarırsa, WordPress-in əsaslandığı URL yenidənyazma qaydaları .htaccess faylınızda ya yoxdur, ya da pozulub.

Nəşr olundu

Ana səhifəniz normal açılır, amma hər bir ayrıca yazı və səhifə 404 qaytarırsa, deməli WordPress-in əsaslandığı URL yenidənyazma qaydaları .htaccess faylınızda ya yoxdur, ya da pozulub. Ən sürətli həll: wp-admin panelində Parametrlər → Daimi keçidlər (Settings → Permalinks) bölməsinə keçin və heç nəyi dəyişmədən Dəyişiklikləri yadda saxla düyməsini basın. Bu, WordPress-i yenidənyazma blokunu yenidən yaratmağa məcbur edir. Əgər 404 xətaları davam edirsə, ya .htaccess faylınız veb server tərəfindən yazıla bilmir, ya Apache onu nəzərə almamaq üçün konfiqurasiya edilib, ya da siz Nginx istifadə edirsiniz (Nginx isə ümumiyyətlə .htaccess istifadə etmir).

Nə üçün ana səhifə işləyir, yazılar isə yox

Ana səhifəniz işləyir, çünki / ünvanına gələn sorğu birbaşa kök qovluqdakı index.php faylı ilə cavablandırılır. Heç bir yenidənyazmaya ehtiyac yoxdur.

/2026/my-post/ ünvanına gələn sorğu isə fərqlidir. Bu yol diskdə real bir qovluq deyil. WordPress-in ona cavab verə bilməsi üçün Apache sorğunu daxildən index.php faylına yönləndirməlidir, sonra WordPress REQUEST_URI dəyərini oxuyur, onu verilənlər bazasındakı rewrite_rules seçimində saxlanan yenidənyazma qaydaları ilə uyğunlaşdırır, sorğu dəyişənlərini həll edir (WP::parse_request()) və düzgün yazını yükləyir.

Apache-dən index.php-yə ötürülmə – məhz sınan hissə budur. O, tamamilə .htaccess faylındakı bu bloka bağlıdır:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

İki RewriteCond sətri belə deyir: əgər tələb olunan yol real bir fayl deyilsə (!-f) və real bir qovluq deyilsə (!-d), onu index.php-yə göndər. Bu bloku silin – Apache əsl /2026/my-post/ qovluğunu axtaracaq, tapmayacaq və WordPress sorğunu görməmişdən əvvəl öz 404 xətasını qaytaracaq.

Nə üçün daimi keçidləri yadda saxladığınızda WordPress .htaccess faylını üstünə yazır

Bu, əksər təlimatların ötüb keçdiyi hissədir. Daimi keçidlər ekranında Yadda saxla düyməsini basdığınızda WordPress flush_rewrite_rules() funksiyasını çağırır. Yazıla bilən .htaccess olan Apache-də bu, save_mod_rewrite_rules() funksiyasını işə salır, o da yuxarıdakı bloku WP_Rewrite::mod_rewrite_rules() vasitəsilə yenidən yaradır və insert_with_markers() funksiyası ilə geri yazır.

insert_with_markers() yalnız # BEGIN WordPress# END WordPress arasındakı sətirlərə toxunur. Bu markerlərdən kənardakı hər şey toxunulmadan qalır. İçəridəki hər şey isə silinir və yenidən yazılır. WordPress-in daha yeni versiyaları hətta xəbərdarlığı birbaşa faylın içində çap edir:

Bu markerlər arasındakı direktivlərə edilən istənilən dəyişiklik üstündən yazılacaq.

Beləliklə, “WordPress .htaccess faylımın üstünə yazır” ifadəsi doğrudur, amma dar mənadadır: o yalnız öz markerli blokunu yenidən yazır və yalnız fayl yazıla biləndə. Əgər fayl yazıla bilmirsə, yadda saxlama diskdə səssizcə heç nə etmir. WordPress Daimi keçidlər ekranında qaydaları əl ilə yerləşdirməyinizi deyən sarı bir bildiriş göstərir və əgər bu bildirişi gözdən qaçırsanız, yenidənyazma blokunuz olmadığı yerdə qalır və hər yazı 404 qaytarmağa davam edir.

Necə düzəltmək olar, ardıcıllıqla

1. Daimi keçidlərinizi yenidən yadda saxlayın. Parametrlər → Daimi keçidlər → Dəyişiklikləri yadda saxla. Heç bir düzəlişə ehtiyac yoxdur. Bu, flush prosesini yenidən işə salır və bloku yenidən yazır. Miqrasiyadan sonra qalmış köhnəlmiş qaydalar da daxil olmaqla, halların əksəriyyətini həll edir.

2. .htaccess faylının mövcudluğunu və yazıla bildiyini yoxlayın. O, wp-config.php ilə eyni qovluqda yerləşir. Bu, gizli fayldır (dotfile), ona görə də FTP proqramınızda “gizli faylları göstər” seçimini aktivləşdirin və ya bundan istifadə edin:

ls -la /path/to/wordpress/.htaccess

Əgər fayl yoxdursa, onu yaradın və düzgün bloku yerləşdirin. Əgər quraşdırmanız alt qovluqda yerləşirsə, RewriteBase və son yenidənyazma hədəfi həmin yolla uyğun olmalıdır – bunu səhv etmək əl ilə yerləşdirilmiş blokun hələ də 404 verməsinin ən çox rast gəlinən səbəbidir. Bizim .htaccess generatorumuz quraşdırma yolunuz üçün dəqiq bloku qurur ki, siz təxmin etməli olmayasınız.

3. Apache-nin .htaccess faylını oxumağa icazəsi olduğuna əmin olun. Əgər virtual hostda AllowOverride None təyin edilibsə, Apache faylın məzmunundan asılı olmayaraq onu tamamilə nəzərə almır. WordPress qovluğunda AllowOverride All (ən azı FileInfo) lazımdır. Bu, .htaccess-də deyil, server konfiqurasiyasındadır, ona görə də server girişi tələb edir:

<Directory /var/www/html>
    AllowOverride All
</Directory>

4. mod_rewrite modulunun aktiv olduğunu təsdiqləyin. Debian/Ubuntu-da:

sudo a2enmod rewrite
sudo systemctl restart apache2

5. Nginx-də .htaccess yoxdur. Yenidənyazmalar əvəzində server blokuna yazılır:

location / {
    try_files $uri $uri/ /index.php?$args;
}

Sürətli diaqnostika: bu, kimin 404-üdür?

404 səhifəsinə baxın. Əgər bu, üslubsuz (dizaynı olmayan) Apache və ya host xəta səhifəsidirsə, deməli Apache heç vaxt WordPress-ə çatmayıb – bu, .htaccess və ya server konfiqurasiyası problemidir (addım 2-4). Əgər bu, sizin mövzunuzun dizayn edilmiş 404 səhifəsidirsə, deməli WordPress sorğunu qəbul edir, amma onu uyğunlaşdıra bilmir – verilənlər bazasındakı qaydalar köhnəlib və daimi keçidləri yenidən yadda saxlamaq (addım 1) həlldir. Bu bircə fərq əksər insanları bir saatlıq təxminlərdən xilas edir.

Nə etməmək lazımdır

Əvvəlcə bütün plaginlərinizi deaktiv etməyin. “Yazılar 404 verir, ana səhifə işləyir” kimi təmiz simptom yenidənyazma problemidir, plagin konfliktinin əlaməti deyil. Plaginləri söndürmək forumlarda refleks kimi verilən cavabdır və demək olar ki, heç vaxt bu məsələyə toxunmur.

.htaccess faylınıza chmod 777 etməyin. WordPress-ə faylın veb server istifadəçisi tərəfindən yazıla bilməsi lazımdır ki, bu da hamı tərəfindən yazıla bilməklə eyni şey deyil. Düzgün sahibi olan 644 normal və təhlükəsizdir; 777 isə onsuz da yönləndirməni düzəltməyəcək bir təhlükəsizlik boşluğudur.

Xüsusi yenidənyazma qaydalarını # BEGIN WordPress / # END WordPress markerlərinin içinə yerləşdirməyin. Növbəti dəfə kimsə daimi keçidləri yadda saxlayanda onlar silinəcək. Xüsusi direktivləri # BEGIN WordPress sətrindən yuxarıya qoyun.

WordPress-i yenidən quraşdırmayın. Nüvə faylları qaydasındadır. Bu, pozulmuş quraşdırma deyil, sadəcə çatışmayan bir mətn blokudur.

Mövzunuzu günahlandırmayın. Daimi keçid yönləndirməsi WordPress nüvəsinin işidir. Mövzu nə buna səbəb ola bilər, nə də onu düzəldə bilər.

Hələ də ilişib qalmısınız?

Əgər daimi keçidləri yenidən yadda saxlamısınızsa, blokun mövcud və yazıla bilən olduğunu təsdiqləmisinizsə və AllowOverride All təyin etmisinizsə, qalan şübhəli tərəf .htaccess faylını arxanızca yenidən yaradan və ya kilidləyən təhlükəsizlik plagini və ya host səviyyəsindəki qaydadır. Daimi keçidi yadda saxladıqdan dərhal sonra faylın dəyişdirilmə vaxtına (timestamp) baxın – əgər dəyişməyibsə, deməli nəsə yazmanı bloklayır. .htaccess generatoru ilə təmiz bir blok yaradın, onu yerləşdirin və güclü yeniləmə (hard refresh) ilə yenidən test edin.