Apache HTTP Sunucusu Sürüm 2.5

Bu belge, mod_rewrite
başvuru belgelerini tamamlar.
mod_rewrite kullanarak birkaç ileri teknik sunar.
Birden Fazla Arka Uç Arasında URL Tabanlı Parçalama
Anında İçerik Yeniden Oluşturma
Yük Dengeleme
Yapılandırılmış Kullanıcı Dizinleri
Çapaların Yeniden Yönlendirilmesi
Zamana Bağlı Yeniden Yazma
URL Parçalarına Göre Ortam Değişkenleri AtamaSunucu yükünü veya depolama alanını dağıtmak için yaygın bir teknik "parçalama" (sharding) olarak adlandırılır. Bu yöntem kullanıldığında, bir ön uç sunucu kullanıcıları veya nesneleri tutarlı bir şekilde ayrı arka uç sunuculara "parçalamak" için URL'yi kullanır.
Kullanıcılardan hedef sunuculara bir eşleme, harici eşlem dosyalarında tutulur. Şöyle görünürler:
user1 physical_host_of_user1
user2 physical_host_of_user2
# ... ve böyle devam eder
Bunu bir map.users-to-hosts dosyasına koyarız. Amaç
şunu eşlemektir;
/u/user1/anypath
buna
http://physical_host_of_user1/u/user/anypath
böylece her URL yolunun her arka uç fiziksel konakta geçerli olması gerekmez. Aşağıdaki kural kümesi, eşlem dosyalarının yardımıyla bunu bizim için yapar; bir kullanıcının eşlemde girdisi yoksa server0'ın öntanımlı sunucu olarak kullanılacağını varsayar:
RewriteEngine on
RewriteMap users-to-hosts "txt:/path/to/map.users-to-hosts"
RewriteRule "^/u/([^/]+)/?(.*)" "http://${users-to-hosts:$1|server0}/u/$1/$2"
Bu yönergenin sözdizimi hakkında daha fazla tartışma için
RewriteMap belgelerine ve
RewriteMap Nasıl Yapılır belgesine
bakın.
İçeriği devingen olarak oluşturmak, ancak oluşturulduktan sonra statik olarak saklamak istiyoruz. Bu kural, statik dosyanın varlığını kontrol eder ve yoksa oluşturur. Statik dosyalar istenirse periyodik olarak (örneğin cron ile) kaldırılabilir ve istek üzerine yeniden oluşturulur.
# This example is valid in per-directory context only
RewriteCond "%{REQUEST_URI}" !-U
RewriteRule "^(.+)\.html$" "/regenerate_page.cgi" [PT,L]
-U işleci, sınama dizgesinin (bu durumda
REQUEST_URI) geçerli bir URL olup olmadığını belirler.
Bunu bir alt istek aracılığıyla yapar. Bu alt istek başarısız
olursa - yani istenen kaynak mevcut değilse - bu kural, istenen
kaynağı oluşturan ve belge dizinine kaydeden
/regenerate_page.cgi CGI programını çalıştırır; böylece
bir sonraki istekte statik bir kopya sunulabilir.
Bu şekilde, seyrek güncellenen belgeler statik biçimde sunulabilir. Belgelerin yenilenmesi gerekiyorsa belge dizininden silinebilir ve bir sonraki istekte yeniden oluşturulur.
mod_rewrite kullanarak yükü birkaç sunucu
arasında rastgele dağıtmak istiyoruz.
Bunu gerçekleştirmek için RewriteMap ve bir sunucu listesi
kullanacağız.
RewriteEngine on
RewriteMap lb "rnd:/path/to/serverlist.txt"
RewriteRule "^/(.*)" "http://${lb:servers}/$1" [P,L]
serverlist.txt sunucuların bir listesini içerecektir:
## serverlist.txt
servers one.example.com|two.example.com|three.example.com
Belirli bir sunucunun diğerlerinden daha fazla yük almasını istiyorsanız, onu listeye daha fazla kez ekleyin.
Apache, mod_rewrite ile bir araya getireceğiniz
herhangi bir şeyden çok daha esnek ve özellik açısından zengin bir yük
dengeleme modülü olan mod_proxy_balancer ile
birlikte gelir.
Binlerce kullanıcısı olan bazı siteler yapılandırılmış bir
ev dizini düzeni kullanır; yani her ev dizini, kullanıcı
adının (örneğin) ilk karakteriyle başlayan bir alt dizindedir.
Böylece, /~larry/anypath şu olur:
/home/l/larry/public_html/anypath;
/~waldo/anypath ise şu olur:
/home/w/waldo/public_html/anypath.
Tilde URL'leri yukarıdaki düzene göre genişletmek için aşağıdaki kural kümesini kullanırız.
RewriteEngine on RewriteRule "^/~(([a-z])[a-z0-9]+)(.*)" "/home/$2/$1/public_html$3"
Öntanımlı olarak, bir HTML çapasına yönlendirme çalışmaz;
çünkü mod_rewrite # karakterini
kodlayarak %23'e dönüştürür. Bu da yönlendirmeyi
bozar.
RewriteRule üzerinde [NE] bayrağını
kullanın. NE, Kodlama Yapma (No Escape) anlamına gelir.
mod_rewrite modülünün öntanımlı
olarak URL-kodladığı diğer özel karakterlerle de çalışacaktır.Günün saatine göre farklı içerik sunmak için
mod_rewrite kullanmak istiyoruz.
Yeniden yazma koşulları için TIME_xxx adlı birçok
değişken vardır. Özel sözlüksel karşılaştırma kalıpları olan
<DİZGE, >DİZGE ve
=DİZGE ile birlikte zamana bağlı yönlendirmeler
yapabiliriz:
RewriteEngine on
RewriteCond "%{TIME_HOUR}%{TIME_MIN}" >0700
RewriteCond "%{TIME_HOUR}%{TIME_MIN}" <1900
RewriteRule "^foo\.html$" "foo.day.html" [L]
RewriteRule "^foo\.html$" "foo.night.html"
Bu, foo.html URL'si altında
07:01-18:59 saatleri arasında
foo.day.html içeriğini, geri kalan zamanda ise
foo.night.html içeriğini sunar.
mod_cache, ara vekiller
ve tarayıcıların her biri yanıtları önbelleğe alabilir ve
yapılandırılan zaman penceresinin dışında herhangi bir sayfanın
gösterilmesine neden olabilir. Bu etkiyi kontrol etmek için
mod_expires kullanılabilir. Elbette, içeriği
devingen olarak sunmak ve günün saatine göre özelleştirmek çok
daha iyidir.Bazen bir yeniden yazma gerçekleştirdiğimizde bir tür durum bilgisi tutmak isteriz. Örneğin, bu yeniden yazmayı yaptığınıza dair bir not almak isteyebilirsiniz; böylece daha sonra bir isteğin bu yeniden yazma yoluyla gelip gelmediğini kontrol edebilirsiniz. Bunu yapmanın bir yolu bir ortam değişkeni ayarlamaktır.
Bir ortam değişkeni ayarlamak için [E] bayrağını kullanın.
RewriteEngine on RewriteRule "^/horse/(.*)" "/pony/$1" [E=rewritten:1]
Daha sonra kural kümenizde bu ortam değişkenini bir RewriteCond kullanarak kontrol edebilirsiniz:
RewriteCond "%{ENV:rewritten}" =1
Ortam değişkenlerinin harici bir yönlendirmeden sonra kalıcı olmadığını unutmayın. [CO] bayrağını kullanarak bir çerez ayarlamayı düşünebilirsiniz. Dizin başına ve htaccess yeniden yazmaları için, son değiştirme dahili bir yönlendirme olarak işlendiğinde, önceki yeniden yazma turundan gelen ortam değişkenlerinin başına "REDIRECT_" eklenir.