<-
Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.5 > Rewrite

mod_rewrite ile İleri Teknikler

Mevcut Diller:  de  |  en  |  es  |  fr  |  ja  |  ko  |  tr  |  zh-cn 

Bu belge, mod_rewrite başvuru belgelerini tamamlar. mod_rewrite kullanarak birkaç ileri teknik sunar.

Bu örneklerin birçoğunun sizin sunucu yapılandırmanızda değişiklik yapılmadan çalışmayacağını unutmayın; bu nedenle örnekleri yapılandırmanıza kopyalayıp yapıştırmak yerine anlamanız önemlidir.

Ayrıca bakınız:

top

Birden Fazla Arka Uç Arasında URL Tabanlı Parçalama

Açıklama:

Sunucu 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.

Çözüm:

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.

top

Anında İçerik Yeniden Oluşturma

Açıklama:

İç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.

Çözüm:
Bu, aşağıdaki kural kümesiyle yapılır:
# 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.

top

Yük Dengeleme

Açıklama:

mod_rewrite kullanarak yükü birkaç sunucu arasında rastgele dağıtmak istiyoruz.

Çözüm:

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.

Tartışma

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.

top

Yapılandırılmış Kullanıcı Dizinleri

Açıklama:

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.

Çözüm:

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"
top

Çapaların Yeniden Yönlendirilmesi

Açıklama:

Ö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.

Çözüm:

RewriteRule üzerinde [NE] bayrağını kullanın. NE, Kodlama Yapma (No Escape) anlamına gelir.

Tartışma:
Bu teknik, mod_rewrite modülünün öntanımlı olarak URL-kodladığı diğer özel karakterlerle de çalışacaktır.
top

Zamana Bağlı Yeniden Yazma

Açıklama:

Günün saatine göre farklı içerik sunmak için mod_rewrite kullanmak istiyoruz.

Çözüm:

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.
top

URL Parçalarına Göre Ortam Değişkenleri Atama

Açıklama:

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.

Çözüm:

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.

Mevcut Diller:  de  |  en  |  es  |  fr  |  ja  |  ko  |  tr  |  zh-cn