mod_rewrite sözdizimi sırası
mod_rewrite, işlemeyi etkileyen bazı özel sipariş kurallarına sahiptir. Herhangi bir şey yapılmadan önce, RewriteEngine On
yönergenin mod_rewrite işlemine başlamasından dolayı verilmesi gerekir. Bu, herhangi bir diğer yeniden yazma direktifinden önce olmalıdır.
RewriteCond
önceki RewriteRule
, bu ONE kuralını şartlı şart haline getirir. İzleyen herhangi bir RewriteRule, koşullara tabi değil gibi işlenecektir.
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html $/blog/$1.sf.html
Bu basit durumda, eğer HTTP yönlendiricisi serverfault.com'dan geliyorsa, blog isteklerini özel serverfault sayfalarına yönlendirin (biz sadece bu kadar özeliz). Ancak, yukarıdaki blok ekstra bir RewriteRule satırına sahipse:
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html $/blog/$1.sf.html
RewriteRule $/blog/(.*)\.jpg $/blog/$1.sf.jpg
Tüm .jpg dosyaları, yalnızca buradan gelen bir yönlendirici olanlara değil, sunucuya özel sayfalara gider. Bu, açıkça bu kuralların nasıl yazıldığının amacı değildir. Birden fazla RewriteCond kuralıyla yapılabilir:
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html /blog/$1.sf.html
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.jpg /blog/$1.sf.jpg
Ancak, muhtemelen bazı zorlu ikame sözdizimi ile yapılmalıdır.
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg) /blog/$1.sf.$2
Daha karmaşık RewriteRule, işleme için koşullamaları içerir. Son parantez, (html|jpg)
RewriteRule öğesine ya html
da ile eşleşmesini jpg
ve eşleşen dizgiyi yeniden yazılmış dizgede $ 2 olarak temsil etmesini söyler . Bu, mantıksal olarak önceki bloğun aynısıdır, iki RewriteCond / RewriteRule çifti ile, bunu dört yerine iki satırda yapar.
Birden çok RewriteCond satırı, dolaylı olarak ANDed'dir ve açıkça ORed olabilir. Hem ServerFault hem de Süper Kullanıcıdan gelen yönlendiricileri işlemek için (açık VEYA):
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$) [OR]
RewriteCond %{HTTP_REFERER} ^https?://superuser\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg) /blog/$1.sf.$2
ServerFault tarafından yönlendirilen sayfalara Chrome tarayıcılarla hizmet vermek için (örtük VE):
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*Chrome.*$
RewriteRule ^/blog/(.*)\.(html|jpg) /blog/$1.sf.$2
RewriteBase
ayrıca, aşağıdaki RewriteRule
direktiflerin işlemlerini nasıl ele aldığını belirttiği için özeldir . .Htaccess dosyalarında çok kullanışlıdır. Eğer kullanılırsa, bir .htaccess dosyasındaki "RewriteEngine on" altındaki ilk yönerge olmalıdır. Bu örneği ele alalım:
RewriteEngine On
RewriteBase /blog
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg) $1.sf.$2
Bu mod_rewrite'a şu anda kullandığı bu URL'nin fiziksel dizin yolu (/ home / $ Username / public_html / blog) yerine http://example.com/blog/ adresinden geldiğini ve buna göre davrandığını söylüyor . Bu nedenle RewriteRule
, URL’deki "/ blog" dan sonra gelmeye başladığını düşünür. İşte iki farklı şekilde yazılmış aynı şey. Biri RewriteBase, diğeri olmadan:
RewriteEngine On
##Example 1: No RewriteBase##
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule /home/assdr/public_html/blog/(.*)\.(html|jpg) $1.sf.$2
##Example 2: With RewriteBase##
RewriteBase /blog
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg) $1.sf.$2
Gördüğünüz gibi RewriteBase
, yeniden yazma kurallarının web sitesi yolunu web sunucusu yerine içeriğe dönüştürmesini sağlar ; bu da onları bu tür dosyaları düzenleyenler için daha anlaşılır hale getirebilir. Ayrıca, estetik çekiciliği olan direktifleri kısaltabilirler.
RewriteRule eşleştirme sözdizimi
RewriteRule'un kendisi eşleşen dizeler için karmaşık bir sözdizimine sahiptir. Bayrakları ([PT] gibi şeyler) başka bir bölümde ele alacağım. Çünkü Sysadmins bir man-sayfa okuyarak daha sık örneklerle öğrendiği için örnekler vereceğim ve ne yaptıklarını açıklayacağım.
RewriteRule ^/blog/(.*)$ /newblog/$1
.*
Yapı tek bir karakterle ( .
) sıfır ya da daha fazla kez ( *
). Parantez içine almak, $ 1 değişkeni ile eşleşen dizeyi sağlamasını söyler.
RewriteRule ^/blog/.*/(.*)$ /newblog/$1
Bu durumda, ilk. * Parantez içine alınmadı, bu yüzden yeniden yazılmış dizgeye yazılmadı. Bu kural yeni blog sitesinde bir dizin seviyesini kaldırır. (/blog/2009/sample.html /newblog/sample.html olur).
RewriteRule ^/blog/(2008|2009)/(.*)$ /newblog/$2
Bu durumda, ilk parantez ifadesi eşleşen bir grup oluşturur. Bu gerekli olmayan ve bu nedenle yeniden yazılmış dizgede kullanılmayan $ 1 olur.
RewriteRule ^/blog/(2008|2009)/(.*)$ /newblog/$1/$2
Bu durumda, yeniden yazılmış dizgede $ 1 kullanıyoruz.
RewriteRule ^/blog/(20[0-9][0-9])/(.*)$ /newblog/$1/$2
Bu kural, bir karakter aralığını belirten özel bir parantez sözdizimi kullanır . [0-9], 0 ile 9 arasındaki rakamlarla eşleşir. Bu özel kural 2000'den 2099'a kadar olan yılları idare eder.
RewriteRule ^/blog/(20[0-9]{2})/(.*)$ /newblog/$1/$2
Bu, önceki kuralla aynı şeyi yapar, ancak {2} kısmı, önceki karakterle (bu durumda bir parantez ifadesi) iki kez eşleşmesini söyler.
RewriteRule ^/blog/([0-9]{4})/([a-z]*)\.html /newblog/$1/$2.shtml
Bu durum, ikinci eşleşen ifadedeki küçük harflerle eşleşir ve olabildiğince çok karakter için bunu yapar. \.
Yapı gerçek nokta değil, önceki örneklerde olduğu özel karakter olarak dönemini tedavi söyler. Yine de, dosya adının içinde tire varsa kırılır.
RewriteRule ^/blog/([0-9]{4})/([-a-z]*)\.html /newblog/$1/$2.shtml
Bu dosya adlarını içinde kısa çizgilerle yakalar. Ancak, -
parantez ifadelerinde özel bir karakter olduğu için , ifadedeki ilk karakter olmalıdır .
RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html /newblog/$1/$2.shtml
Bu sürüm, herhangi bir dosya adını harf, sayı veya dosya adındaki -
karakter ile hapseder . Bu, parantez ifadesinde birden çok karakter kümesini belirtme şeklinizdir.
RewriteRule bayrakları
Yeniden yazma kurallarındaki bayraklar çok sayıda özel anlam ve kullanım alanına sahiptir .
RewriteRule ^/blog/([0-9]{4})/([-a-z]*).\html /newblog/$1/$2.shtml [L]
Bayrak, [L]
yukarıdaki ifadenin sonundadır. Virgülle ayrılmış olarak birden çok bayrak kullanılabilir. Bağlantılı belgeler her birini açıklar, ama yine de buradalar:
L = Son. Bu eşleştikten sonra RewriteRule'leri işlemeyi durdurun. Sipariş sayar!
C = Zincir. Bir sonraki RewriteRule'u işlemeye devam edin. Bu kural eşleşmezse, sonraki kural yürütülmez. Bunun üzerine daha sonra.
E = Çevre değişkenini ayarla. Apache, web sunucusu davranışını etkileyebilecek çeşitli çevresel değişkenlere sahiptir.
F = Yasak. Bu kural eşleşirse 403-Yasaklı hata verir.
G = Gitti. Bu kural eşleşirse 410-Gone hatası verir.
H = İşleyici. İsteği, belirtilen MIME türündemiş gibi ele alınmaya zorlar.
N = İleri Kuralı yeniden başlatmaya ve eşleşmeye zorlar. DİKKATLİ OL! Döngüler ortaya çıkabilir.
NC = Durum yok. verirjpg
hem jpg hem de JPG ile eşleşecek.
NE = Kaçış yok. Özel karakterlerin (.? # & Etc) onaltılık kod eşdeğerlerine yeniden yazılmasını önler.
NS = Alt istek yok. Sunucu tarafı içeriklerini kullanıyorsanız, bu eklenen dosyalarla eşleşmeleri önler.
P = Proxy. Kuralı mod_proxy tarafından ele alınmaya zorlar. Net olarak diğer sunuculardan içerik sağlayın, çünkü web sunucunuz onu alır ve yeniden sunar. Bu tehlikeli bir bayrak, kötü yazılmış bir web sunucusu sunucunuzu açık proxy'ye çevirecek ve Bu Kötü.
PT = Geçiş Yap. RewriteRule eşlemesindeki Alias ifadelerini dikkate alın.
QSA = QSAppend. Orijinal dize bir sorgu içerdiğinde ( http://example.com/thing?asp=foo) Özgün sorgu dizesini yeniden yazılmış dizeye ekleyin. Normalde atılırdı. Dinamik içerik için önemlidir.
R = Yönlendirme. Belirtilen URL’ye bir HTTP yönlendirmesi sağlayın. Tam yönlendirme kodu da sağlayabilir [R = 303]. Çok benzer RedirectMatch
, hangisi daha hızlı ve mümkün olduğunda kullanılmalıdır.
S = Atla. Bu kuralı atla.
T = Tip Döndürülen içeriğin MIME türünü belirtin. AddType
Direktife çok benzer .
Bunun RewriteCond
tek bir kural için nasıl geçerli olduğunu söylediğimi biliyor musun ? Bunu zincirleme yaparak halledebilirsin.
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html /blog/$1.sf.html [C]
RewriteRule ^/blog/(.*)\.jpg /blog/$1.sf.jpg
İlk RewriteRule, Zincir bayrağına sahip olduğundan, ikinci yeniden yazma kuralı, ilk yapıldığında, yani önceki RewriteCond kuralı eşlendiğinde yürütülür. Eğer Apache düzenli ifadeler beyninizi incitirse işe yarar. Bununla birlikte, birinci bölümde işaret ettiğim hepsi bir arada yöntemi, optimizasyon açısından daha hızlı.
RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html /newblog/$1/$2.shtml
Bu, bayraklar aracılığıyla daha basit hale getirilebilir:
RewriteRule ^/blog/([0-9]{4})/([-0-9a-z]*)\.html /newblog/$1/$2.shtml [NC]
Ayrıca, bazı bayraklar RewriteCond için de geçerlidir. Özellikle, NoCase.
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$) [NC]
"ServerFault.com" ile eşleşecek