Bir kullanıcı tarayıcıya belirli bir URL girip Enter tuşuna bastığında, isteği alan web sunucusu URL'de belirtilen yolda sunucuda bir dosya bulmaya çalışır. Yol boyunca hiçbir şey bulunamazsa, index.html veya index.php gibi bir dizin dosyası açılır. hiçbir şey bulunamazsa, 404 hatası döndürülür. İşler şu anda olduğu gibi yürümeseydi güzel ve anlaşılması kolay URL'lerimiz olmazdı. Bu URL'ler birçok sitede kullanılmaktadır. Apache mod rewrite modülü bu sorunu çözmek için tasarlanmıştır Bu eğitimde onu nasıl etkinleştireceğimizi göreceğiz.
Her şey anlatıldığı gibi çalışsaydı, kök dizinde bu sitenin herhangi bir bağlantısını açtığınızda adres çubuğunda aynı ada sahip bir dosya veya komut dosyası olması gerekirdi. Ama öyle değil. Bu URL istendiğinde, web sunucusu böyle bir dosyayı bulmaya çalışır, ancak bulamazsa, 404 hatası döndürmek yerine, kontrolü mod_rewrite modülüne geçirir, bu da bu tür tüm URL'ler için index.php betiğini çalıştırır ve alan adından sonra sorgu dizesini iletir. PHP daha sonra kullanıcının ihtiyaç duyduğu sayfayı bulmak ve döndürmek için bu verileri kullanır.
Mod rewrite'ı etkinleştirmek için basit bir komut çalıştırın:
$ sudo a2enmod rewrite
Web sunucusunu yeniden başlattıktan sonra:
$ sudo systemctl restart apache
Modülün Apache web sunucusu düzeyinde etkinleştirilmiş olması, bir web sitesi için çalışacağı anlamına gelmez. Bu amaçla, .htaccess dosyasında yapılandırılmalı, var olmayan sayfalara isteklerin hangi betik üzerinden iletileceği belirtilmelidir. .htaccess dosyasının çalışabilmesi için sanal konağın Directory bölümüne AllowOwerride: All
yönergesi eklenmelidir
Örnek olarak:
Daha sonra, örneğin WordPress'te .htaccess dosyasına aşağıdaki gibi satırlar eklemeniz gerekir:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
Tüm kod IfModule yönergesine yerleştirilir ve içindeki kodun yalnızca mod_rewrite modülü etkinleştirildiğinde çalıştırılmasına izin verir, aksi takdirde bu satırlar basitçe yok sayılır. RewriteEngine On yönergesi geçerli dizin için modülü etkinleştirir. Ardından RewriteBase, etki alanından sonraki tüm dizenin betiğe aktarılması gerektiğini belirtir. Daha sonra, kesinlikle sırayla çalıştırılan RewriteCond için koşulları olan RwriteRule kuralları gelir.
RewriteRule kurallarından biri ^index .php$ - [L]
, URL index.php içeriyorsa URL'nin / olarak yeniden yazılması gerektiğini söyler. Bu düzenli ifadede, tüm dize belirtilir ve nokta ters eğik çizgi ile kaçar. L]
bayrağı, URL'nin bu kuralla eşleşmesi durumunda aşağıdaki kuralların denetlenmemesi gerektiği anlamına gelir. Bu kural yürütüldükten sonra, URL yeniden yazılır ve web sunucusu / isteğini aldığını varsayar, kural analizi yeniden başlar ve bu kez son kuralla eşleşir.
RewriteCond koşulları sonraki tüm kurallar için geçerlidir. Yani RewriteCond %{REQUEST_FILENAME} !-f
ve RewriteCond %{REQUEST_FILENAME} !-d
son kuralın yalnızca URL bir dosya veya klasör değilse çalıştırılmasını sağlar. Son kural her şeyi ./index.php betiğine yönlendirir.
Eğer mod_rewrite ayarlarını anlayamıyorsanız, yönlendirmeleriniz sırasında web sunucusunun içinde neler olup bittiğine bakmak faydalı olacaktır. Bunu yapmak için sitenin sanal ana bilgisayarının yapılandırmasına bu satırı eklemeniz gerekir.
Örneğin:
$ sudo vi /etc/apache2/sites-available/001-texts.conf
LogLevel warn rewrite:trace4
Daha sonra ErrorLog yönergesinde verilen günlük dosyasında, web sunucusunun URL'yi kurallarınıza göre dönüştürmek için yaptığı tüm girişimleri görecek ve neyi yanlış yaptığınızı anlayabileceksiniz. Bu eğitimde, Apache mod rewrite'ın nasıl etkinleştirileceğini, nasıl çalıştığını ve hataların nasıl aranacağını ele aldık.