Hangi mod_rewrite işlevini anlamak için önce bir web sunucusunun nasıl çalıştığını anlamanız gerekir. Bir web sunucusu HTTP isteklerine yanıt verir . En temel düzeydeki bir HTTP isteği şöyle görünür:
GET /foo/bar.html HTTP/1.1
Bu, bir tarayıcıdan URL'yi isteyen bir web sunucusuna basit bir istektir /foo/bar.html
. Bir dosya istemediğini , sadece rastgele bir URL istediğini vurgulamak önemlidir . İstek ayrıca şöyle görünebilir:
GET /foo/bar?baz=42 HTTP/1.1
Bu, bir URL için geçerli bir istektir ve dosyalar ile hiçbir ilgisi yoktur.
Web sunucusu, bir bağlantı noktasını dinleyen, o bağlantı noktasına gelen HTTP isteklerini kabul eden ve yanıt veren bir uygulamadır. Bir web sunucusu, herhangi bir isteğe uygun / herhangi bir şekilde yanıt verecek şekilde yapılandırdığınız herhangi bir isteğe yanıt vermekte tamamen serbesttir. Bu yanıt bir dosya değil, herhangi bir diskteki fiziksel dosyalarla ilgisi olan veya olmayan bir HTTP yanıtıdır . Bir web sunucusunun Apache olması gerekmez, hepsi sadece sürekli çalışan ve HTTP isteklerine yanıt veren bir bağlantı noktasına bağlı programlar olan birçok web sunucusu vardır. Birini kendiniz yazabilirsiniz. Bu paragrafın amacı, URL'lerin doğrudan dosyalara eşit olduğu ve gerçekten anlaşılması gereken herhangi bir kavramdan boşanmaktır. :)
Çoğu web sunucusunun varsayılan yapılandırması, sabit diskteki URL ile eşleşen bir dosya aramaktır. Eğer belge kök sunucusu olarak ayarlanır, diyelim ki, /var/www
bu dosya olup olmadığını görünebilir /var/www/foo/bar.html
varsa ve o kadar eğer hizmet vermektedir. Dosya uçları ".php" Eğer PHP tercüman çağırmak ve edecek ardından sonuç döndürüyor. Tüm bu ilişki tamamen yapılandırılabilir; bir dosyanın web sunucusunun PHP yorumlayıcısı aracılığıyla çalıştırması için ".php" ile bitmesi gerekmez ve URL'nin bir şey olması için diskteki belirli bir dosyayla eşleşmesi gerekmez.
mod_rewrite, dahili istek işlemeyi yeniden yazmanın bir yoludur . Web sunucusu URL için bir istek aldığında /foo/bar
şunları yapabilirsiniz yeniden eşleştirebilmemizi diskteki bir dosyaya arayacaktır web sunucusu önce başka bir şeye o URL'yi. Basit örnek:
RewriteEngine On
RewriteRule /foo/bar /foo/baz
Bu kural, bir istek "/ foo / bar" ile eşleştiğinde bunu "/ foo / baz" olarak yeniden yazar. Bu talep daha sonra /foo/baz
talep edilmiş gibi ele alınacaktır . Bu, çeşitli efektler için kullanılabilir, örneğin:
RewriteRule (.*) $1.html
Bu kural bir şeyle ( .*
) eşleşir ve onu yakalar ( (..)
), ardından ".html" eklemek için yeniden yazar. Başka bir deyişle, /foo/bar
istenen URL olsaydı , istenmiş gibi işlenir /foo/bar.html
. Normal ifade eşleştirme, yakalama ve değiştirme hakkında daha fazla bilgi için http://regular-expressions.info adresine bakın .
Sık karşılaşılan başka bir kural şudur:
RewriteRule (.*) index.php?url=$1
Bu, yine herhangi bir şeyle eşleşir ve url
query parametresine eklenen orijinal olarak istenen URL ile index.php dosyasına yeniden yazar . Yani, gelen tüm istekler için, index.php dosyası yürütülür ve bu dosya orijinal isteğe erişebilir $_GET['url']
, böylece onunla istediği her şeyi yapabilir.
Öncelikle bu yeniden yazma kurallarını web sunucusu yapılandırma dosyanıza koyarsınız . Apache ayrıca * bunları .htaccess
belge kökünüzde (yani .php dosyalarınızın yanında) adlı bir dosyaya koymanıza izin verir .
* Eğer birincil Apache yapılandırma dosyası tarafından izin; isteğe bağlıdır, ancak genellikle etkindir.
Mod_rewrite'ı gelmez Ne değil yapmak
mod_rewrite, tüm URL'lerinizi sihirli bir şekilde "güzel" yapmaz. Bu yaygın bir yanlış anlamadır. Web sitenizde bu bağlantı varsa:
<a href="https://stackoverflow.com/my/ugly/link.php?is=not&very=pretty">
mod_rewrite'ın bunu güzelleştirmek için yapabileceği hiçbir şey yok. Bunu güzel bir bağlantı haline getirmek için yapmanız gerekenler:
Bağlantıyı güzel bir bağlantıyla değiştirin:
<a href="https://stackoverflow.com/my/pretty/link">
/my/pretty/link
Yukarıda açıklanan yöntemlerden birini kullanarak URL isteğini işlemek için sunucuda mod_rewrite komutunu kullanın .
( mod_substitute
Giden HTML sayfalarını ve içerdiği bağlantıları dönüştürmek için birlikte kullanılabilir . Yine de bu genellikle HTML kaynaklarınızı güncellemekten daha fazla çaba gerektirir.)
Çok sayıda yeniden yazma, zincirleme isteklerini tamamen farklı bir hizmete veya makineye proxy gönderme, belirli HTTP durum kodlarını yanıt olarak döndürme, yeniden yönlendirme istekleri vb. temel HTTP istek-yanıt mekanizmasını anlarsanız çok iyi. O mu değil otomatik bağlantıları oldukça olun.
Olası tüm bayraklar ve seçenekler için resmi belgelere bakın .