Məzmuna keç
Server və .htaccess

WordPress .htaccess Yönləndirmə Qaydaları: 301-ləri Düzgün Qurmaq

URL-i mövqelərinizi itirmədən dəyişin: hansı WordPress .htaccess yönləndirmə direktivini seçmək, qaydaların harada dayanmalı olduğu və sistemdən çıxmadan necə test etmək.

Nəşr olundu

URL-i dəyişirsiniz və köhnəsinin mövqelərini saxlamasını istəyirsiniz? Sizə .htaccess faylında 301 lazımdır — WordPress-in onu silməyəcəyi yerə qoyulmuş, düzgün direktivlə yazılmış və WordPress-in real olaraq verdiyi dəqiq URL-ə yönəldilmiş. Bu üçündən hər hansı birini səhv etsəniz, yönləndirmə zənciri, dövrə, ya da sizi wp-admin panelindən kənarda qoyan 500 xətası alırsınız.

Qərar, yerləşdirmə qaydası və test — məhz bu ardıcıllıqla.

Hansı direktiv: Redirect, RedirectMatch, yoxsa RewriteRule

İşin içində iki Apache modulu var və onlar bir-birini əvəz etmir.

Redirect (mod_alias) — bir məlum yoldan bir təyinata. İşləyən ən sadə variant:

Redirect 301 /old-page/ https://example.com/new-page/

Bilməli olduğunuz iki davranış var. O, dəqiq sətirlə deyil, yol prefiksi ilə uyğunlaşır, ona görə də /old-page/ həm də /old-page/anything/ ünvanını tutur və təyinata /anything/ hissəsini əlavə edir. Həmçinin sorğu sətrini avtomatik olaraq özü ilə aparır.

RedirectMatch (mod_alias) — çoxlu URL-i əhatə edən bir müntəzəm ifadə. Bütöv bir bölməni belə köçürürsünüz:

RedirectMatch 301 ^/blog/(.*)$ https://example.com/articles/$1

Tutma qrupu (.*) təyinatda $1 olur, beləliklə /blog/hello-world/ ünvanı /articles/hello-world/ ünvanına düşür. Baş tərəfdəki kəsik işarəsinə diqqət yetirin: mod_alias şablonları tam URL yolu ilə uyğunlaşır.

RewriteRule (mod_rewrite) — yönləndirmə bir şərtdən asılı olanda tələb olunur: host adı, protokol, sorğu sətri, istifadəçi agenti. mod_alias modulundakı heç nə bunları yoxlaya bilmir.

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

Qovluq səviyyəsindəki .htaccess faylında şablonun baş tərəfindəki kəsik işarəsi kəsilir — burada ^(.*)$, mod_alias nümunəsində isə ^/blog/ olmasının səbəbi budur. Bunu qarışdırmaq, kopyalanıb yapışdırılan qaydanın səssizcə heç nə etməməsinin ən çox rast gəlinən səbəbidir.

Standart olaraq mod_alias seçin. RewriteRule variantına yalnız şərt lazım olanda müraciət edin. Nə qədər az müntəzəm ifadə, o qədər az səhv etmə yolu.

Qaydalar harada dayanmalıdır

Xüsusi yönləndirmələr # BEGIN WordPress sətrindən yuxarıda yerləşir. Onun içində yox.

# --- custom redirects ---
Redirect 301 /old-page/ https://example.com/new-page/
RedirectMatch 301 ^/blog/(.*)$ https://example.com/articles/$1

# BEGIN WordPress
# The directives (lines) between "BEGIN WordPress" and "END WordPress" are
# dynamically generated, and should only be modified via WordPress filters.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Bir-birindən asılı olmayan iki səbəb:

  1. WordPress öz blokunu yenidən yazır. Parametrlər → Daimi keçidlər ekranını yadda saxlamaq flush_rewrite_rules() funksiyasını çağırır, o da markerlər arasındakı hər şeyi atır və yenidən yaradır. İçəriyə qoyduğunuz qayda növbəti dəfə kimsə həmin ekrana toxunanda yox olur — bəlkə də aylar sonra, üstəlik heç kim iki hadisəni bir-biri ilə əlaqələndirməyəcək.
  2. Ardıcıllıq qalibi müəyyən edir. WordPress bloku fayl və qovluq olmayan hər sorğunu index.php faylına göndərən universal qayda ilə bitir. Ondan sonra yerləşdirilən RewriteRule heç vaxt işə düşmür.

Bir dürüst nüans: mod_alias və mod_rewrite əslində fayldakı ardıcıllıqla işləmir. Apache mod_alias modulunu URL tərcüməsi mərhələsində, qovluq səviyyəsindəki mod_rewrite modulunu isə daha sonra, fixup mərhələsində emal edir — ona görə də Redirect sətri fayl içində ondan yuxarıda duran RewriteRule qaydasını üstələyə bilər. Əgər üst-üstə düşən yollarda hər ikisinə ehtiyac duyursunuzsa, həmin yol üçün bir modul seçin və onun daxilində qalın. mod_alias ilə mod_rewrite arasındakı dava-dalaşı sazlamaq sərf edilən bir saata dəymir.

Sondakı kəsik işarələri

WordPress-in öz kanonik yönləndirməsi əksər daimi keçidlərə sonda kəsik işarəsi əlavə edir. Beləliklə, bu:

Redirect 301 /old-page/ https://example.com/new-page

iki addım yaradır — sizin 301 yönləndirmənizi kəsiksiz URL-ə, sonra isə WordPress-in kəsik əlavə edən öz 301 yönləndirməsini. Zəncirlər reytinq siqnallarını yenə də ötürür, amma tarama büdcəsini israf edir və hər ziyarətçi üçün əlavə bir gediş-gəliş yaradır.

Əvvəlcə təyinatı brauzerdə açın, ünvan sətrində sabitləşən URL-i olduğu kimi kopyalayın və məhz onu istifadə edin. Əgər daimi keçid strukturunuz .html ilə bitirsə və ya sonda kəsik işarəsi yoxdursa, ona uyğunlaşın. Burada hamı üçün doğru olan tək cavab yoxdur, yalnız «WordPress nə verirsə, ona uyğunlaşın» prinsipi var.

Özünüzü sistemdən kənarda qoymadan test etmək

.htaccess hər sorğuda oxunur. Sintaksis xətası wp-admin daxil olmaqla bütün sayt üçün 500 qaytarır, ona görə də bərpa yolu ona ehtiyacınız yaranmamışdan əvvəl mövcud olmalıdır.

Əvvəlcə faylın ehtiyat nüsxəsini götürün. SSH üzərindən:

cp /path/to/wordpress/.htaccess /path/to/wordpress/.htaccess.bak

Sayt 500 verərsə, pozulmuş faylın üstünə köhnəsini adlandırın və sayt dərhal qayıdır. Başqa bir pəncərədə açıq SFTP sessiyası saxlayın — sayt sıradan çıxmış vəziyyətdə sıfırdan giriş etməyə çalışmaq, məhz təlaşın başladığı yerdir. Nəzərə alın ki, apachectl configtest əmri .htaccess faylını oxumur, ona görə də saytınız ölü vəziyyətdə ikən o, konfiqurasiyanın sağlam olduğunu bildirəcək.

Brauzerlə deyil, curl ilə test edin. Brauzerlər 301 cavablarını möhkəm keşləyir və sizə həvəslə dünənki nəticəni göstərəcək:

curl -sI https://example.com/old-page/ | head -n 5

İki şeyi oxuyun: status sətri 301 deməlidir, Location: başlığı isə dəqiq son URL olmalıdır. Bütün zənciri görmək üçün onu izləyin:

curl -sIL https://example.com/old-page/ | grep -E '^(HTTP|Location)'

Birdən çox HTTP/1.1 301 sətri zəncir qurduğunuz deməkdir. Təxminən beşdən çoxu dövrə qurduğunuz deməkdir və curl dayanıb bunu sizə bildirəcək.

Hələ əmin deyilsinizsə, 302 istifadə edin. 302 eyni şəkildə keşlənmir, ona görə də səhv saniyələr içində geri qaytarıla bilir. curl istədiyiniz təyinatı göstərəndən sonra 301-ə keçin. Bu, heç nəyə başa gəlmir və bu məqalədəki hər hansı digər vərdişdən daha çox saytı xilas edib.

Əgər qayda ümumiyyətlə heç nə etmirsə, Apache-nin faylı oxuduğunu belə təsdiqləyin. Qovluqda AllowOverride None təyin edilibsə, Apache .htaccess faylını tamamilə nəzərə almır, nginx isə onu ümumiyyətlə oxumur — müntəzəm ifadələri sazlamağa başlamazdan əvvəl curl -I ilə Server: başlığını yoxlayın. Bloku Apache versiyanıza və quraşdırma yolunuza uyğun düzgün sintaksisdə yığmaq üçün WordPress .htaccess generatorundan istifadə edin.

.htaccess-i ümumiyyətlə istifadə etməməli olduğunuz hallar

Redaktorların özlərinin idarə etməli olduğu bir neçə yönləndirmə üçün qaydaları verilənlər bazasında saxlayan yönləndirmə plagini daha uyğun vasitədir — o, host miqrasiyalarından sağ çıxır və SSH tələb etmir. Güzəşt isə realdır: yönləndirməni vermək üçün php işə düşməlidir, bu da Apache-nin birbaşa cavab verməsindən yavaşdır.

.htaccess faylını struktur xarakterli, daimi köçürmələr üçün istifadə edin — domen dəyişikliyi, bölmənin adının dəyişməsi, https və ya www-nin məcbur edilməsi. Birdəfəlik redaksiya yönləndirmələri üçün plagin istifadə edin. Hər ikisini birlikdə etmək normaldır, bir şərtlə ki, hansı təbəqənin hansı URL-ə sahib olduğunu bilirsiniz, çünki iki yerdə təyin edilmiş yönləndirmə pis bir günortanı gözləyən nasazlıqdır.

FAQ

Suallar

WordPress .htaccess faylında xüsusi yönləndirmələr harada yerləşməlidir?

# BEGIN WordPress sətrindən yuxarıda, heç vaxt markerlərin arasında yox. Kimsə Daimi keçidlər ekranını yadda saxlayanda WordPress həmin markerlərin içindəki hər şeyi yenidən yaradır, ona görə də içəriyə qoyulan qayda xəbərdarlıq olmadan silinir. Yerləşdirmə həm də ardıcıllıq üçün vacibdir: WordPress bloku uyğun gəlməyən bütün sorğuları index.php faylına göndərən universal qayda ilə bitir.

301 üçün Redirect, RedirectMatch, yoxsa RewriteRule istifadə etməliyəm?

Tək bir məlum yol üçün Redirect, bir şablon çoxlu URL-i əhatə edəndə RedirectMatch, yönləndirmə host adı, protokol və ya sorğu sətri kimi bir şərtdən asılı olanda isə RewriteRule istifadə edin. Redirect və RedirectMatch mod_alias modulundan gəlir və daha sadədir. RewriteRule mod_rewrite modulundandır və şərtləri yoxlaya bilən yeganə variantdır.

Nə üçün mənim .htaccess yönləndirməm yönləndirmə dövrəsinə səbəb olur?

Adətən təyinat ünvanı ziyarətçini ora göndərən qaydaya hələ də uyğun gəlir, ona görə də qayda sonsuz təkrarlanır. Digər geniş yayılmış səbəb yük balanslaşdırıcısı və ya CDN arxasında https-i məcbur etməkdir: ziyarətçi artıq təhlükəsiz bağlantıda olsa da, server hər sorğunu adi http kimi görür. Onun əvəzinə X-Forwarded-Proto başlığını yoxlayın.

WordPress yönləndirməsində sondakı kəsik işarəsinin əhəmiyyəti varmı?

Bəli. WordPress-in kanonik yönləndirməsi əksər daimi keçidlərə sonda kəsik işarəsi əlavə edir, ona görə də 301-i kəsiksiz URL-ə yönəltmək bir addım əvəzinə iki addım yaradır. Zəncirvari yönləndirmələr reytinq siqnallarını yenə də ötürür, amma tarama büdcəsini israf edir və ziyarətçini yavaşladır. WordPress-in real olaraq verdiyi son URL-i, kəsik işarəsi də daxil olmaqla, dəqiq uyğunlaşdırın.

Saytımı sındırmadan .htaccess yönləndirməsini necə test edə bilərəm?

Brauzerə etibar etməzdən əvvəl köhnə URL-ə qarşı curl əmrini yalnız başlıqları göstərən bayraqla işlədin və status kodu ilə Location başlığını oxuyun. Brauzerlər 301 cavablarını aqressiv şəkildə keşləyir və sizə köhnəlmiş nəticə göstərəcək. Əvvəlcə işlək faylın nüsxəsini saxlayın, çünki .htaccess faylındakı sintaksis xətası wp-admin daxil olmaqla hər səhifədə 500 qaytarır.

Nə üçün yönləndirmə əlavə etdikdən sonra bütün saytım 500 xətası verdi?

Fayl daxilindəki tək bir səhv yazılmış .htaccess direktivi həmin qovluq altındakı bütün URL-ləri, idarə panelini də daxil olmaqla, sıradan çıxarır. Geniş yayılmış səbəblər bağlanmamış IfModule örtüyü, çatışmayan RewriteEngine On sətri, yaxud Apache 2.2 və 2.4 giriş sintaksisinin bir faylda qarışdırılmasıdır. Əlavə etdiyiniz son bloku silin və təsdiqləmək üçün səhifəni yeniləyin.