mod_rewrite sözdizimi sırası
mod_rewrite işlemeyi etkileyen bazı özel sipariş kurallarına sahiptir. Bir şey yapılmadan önce, RewriteEngine On
Bu mod_rewrite işlemeyi başlattığı için direktifin verilmesi gerekiyor. Bu, başka herhangi bir yeniden yazma direktifinden önce olmalıdır.
RewriteCond
önceki RewriteRule
Bir kuralın şartlı duruma tabi olmasını sağlar. Aşağıdaki RewriteRules, koşullara tabi olmadıkları gibi işlenir.
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html $/blog/$1.sf.html
Bu basit durumda, HTTP yönlendiricisi serverfault.com'dan geliyorsa, blog isteklerini özel sunucu hatası sayfalarına yönlendirin (biz sadece bu kadar özeliz). Ancak, yukarıdaki bloğun fazladan bir RewriteRule hattı varsa:
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ı özel serverfault sayfalarına gider, sadece buradan gelen bir yönlendirici ile değil. Bu açıkça, bu kuralların nasıl yazıldığının amacı değildir. Birden çok RewriteCond kuralları ile 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
Ama muhtemelen bazı daha zorlayıcı 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 koşullarını içerir. Son parantez, (html|jpg)
RewriteRule’e eşleşmesini söyler. html
veya jpg
ve yeniden yazılan dizede eşleşen dizeyi $ 2 olarak göstermek. Bu, iki RewriteCond / RewriteRule çiftiyle önceki blokla mantıksal olarak aynıdır, sadece dört yerine iki satırda yapar.
Birden çok RewriteCond satırı örtülü ANDED'dir ve açıkça ORed olabilir. ServerFault ve Super User'dan (açık OR) gelen yönlendiricileri işlemek için:
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$) [OR]
RewriteCond %{HTTP_REFERER} ^https?://superuser\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg) /blog/$1.sf.$2
Chrome tarayıcılarıyla birlikte ServerFault başvurulan sayfaları sunmak için (örtük AND):
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ğıdakileri belirttiği kadar spesifiktir RewriteRule
Direktifler işlemlerini yürütür. .Htaccess dosyalarında çok kullanışlıdır. Kullanılırsa, bir .htaccess dosyasında "RewriteEngine on" altındaki ilk yönerge olmalıdır. Bu örneği al:
RewriteEngine On
RewriteBase /blog
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg) $1.sf.$2
Bu mod_rewrite, şu anda işleme koyduğu bu özel URL'nin yoldan geldiğini anlatıyor. http://example.com/blog/ fiziksel dizin yolu yerine (/ home / $ Username / public_html / blog) ve buna göre davranır. Bundan dolayı, RewriteRule
URL'deki "/ blog" un ardından dizgin-başlangıcı olduğunu düşünür. İşte aynı şey iki farklı yolla yazılmış. RewriteBase ile biri, diğeri ise:
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 gibi, RewriteBase
Web’ten yararlanmak için kuralların yeniden yazılmasını sağlar.yer Web'den ziyade içeriğe giden yolsunucuBu tür dosyaları düzenleyenlere daha kolay anlaşılabilir. Ayrıca, estetik çekiciliği olan direktifleri kısaltabilirler.
RewriteRule eşleme sözdizimi
RewriteRule kendisinin dizeleri eşleştirmek için karmaşık bir sözdizimine sahiptir. Başka bir bölümde bayrakları ([PT] gibi şeyler) kapsayacağım. Çünkü Sysadmins, örneğin bir adam sayfalık Örnek vereceğim ve ne yaptıklarını açıklayacağım.
RewriteRule ^/blog/(.*)$ /newblog/$1
.*
inşa herhangi bir karakterle eşleşir (.
) sıfır veya daha fazla kez (*
). Parantez içinde saklamak, $ 1 değişkeniyle eşleştirilen dizeyi sağlamasını söyler.
RewriteRule ^/blog/.*/(.*)$ /newblog/$1
Bu durumda, ilk. * Parens içinde kapalı DEĞİL, bu yüzden yeniden yazılan dizeye verilmez. 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ılan dizede kullanılmayan $ 1 olur.
RewriteRule ^/blog/(2008|2009)/(.*)$ /newblog/$1/$2
Bu durumda, yeniden yazılan dizede 1 $ kullanırız.
RewriteRule ^/blog/(20[0-9][0-9])/(.*)$ /newblog/$1/$2
Bu kural, bir karakteri belirten özel bir parantez sözdizimi kullanır. menzil. [0-9], 0 ile 9 arasındaki rakamları eşleştirir. Bu özel kural, 2000'den 2099'a kadar olan yılları işleyecektir.
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şecek ve bunu olabildiğince çok karakter için yapacaktır. \.
Yapı, periyodu gerçek bir dönem olarak ele almayı, önceki örneklerde yer alan özel karakteri değil söyler. Bununla birlikte, dosya adının içinde tire işareti varsa kırılır.
RewriteRule ^/blog/([0-9]{4})/([-a-z]*)\.html /newblog/$1/$2.shtml
Bu, dosya adlarını içlerindeki tire işaretleriyle yakalar. Ancak, -
Braket ifadelerinde özel bir karakterdir. ilk ifadedeki karakter.
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. Braket ifadesinde çoklu karakter kümelerini böyle belirtirsiniz.
RewriteRule bayrakları
Yeniden yazma kuralları üzerindeki bayrakların bir dizi özel anlamları ve kullanım alanları vardır..
RewriteRule ^/blog/([0-9]{4})/([-a-z]*).\html /newblog/$1/$2.shtml [L]
Bayrak [L]
Yukarıdaki ifadenin sonunda. Birden çok bayrak, virgülle ayrılmış olarak kullanılabilir. Bağlantılı belgeler her birini açıklar, ancak burada yine de vardır:
L = Son. Bu bir kez eşleştiğinde RewriteRules işlemini durdurun. Emir sayımı!
C = Zincir. Bir sonraki RewriteRule işlemeye devam edin. Bu kural eşleşmezse, sonraki kural yürütülmez. Daha sonra bunun üzerine.
E = Ortam değişkenini ayarlayın. Apache, web-sunucu davranışını etkileyebilecek çeşitli çevresel değişkenlere sahiptir.
F = Yasaktır. Bu kural uyuşuyorsa 403-Yasak bir hatayı döndürür.
G, = Gitti. Bu kural uyuşuyorsa 410-Gone hatası döndürür.
'H = İşleyici. İstek, belirtilen MIME türüymiş gibi ele alınmasını zorlar.
N- = İleri. Kuralın yeniden başlamasını ve yeniden eşleşmesini zorlar. DİKKATLİ OL! Döngüler olabilir.
NC = Durum yok. verir jpg
jpg ve JPG hem de eşleştirmek için.
NE = Kaçış yok. Özel karakterlerin (.? # & Etc) onaltılık kod eşdeğerlerine yeniden yazılmasını önler.
NS = Alt sorgu bulunamadı. Sunucu tarafı içerenler kullanıyorsanız, bu, dahil edilen dosyaların eşleşmesini engeller.
P = Proxy. Kuralın mod_proxy tarafından işlenmesini zorlar. Web sunucunuz onu getirdiği ve yeniden sunacağı için, diğer sunuculardan içerik sağlamak. Bu, tehlikeli bir bayraktır, çünkü kötü yazılmış bir kişi web sunucunuzu bir açık proxy'ye dönüştürür ve bu da Kötüdür.
PT = Geçiş. RewriteRule eşleştirmesinde 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ılan dizeye ekler. Normalde atılır. Dinamik içerik için önemli.
R, = Yönlendir. Belirtilen URL'ye bir HTTP yönlendirmesi sağlayın. Tam yönlendirme kodu da sağlayabilir [R = 303]. Çok benzer RedirectMatch
Daha hızlı ve mümkün olduğunda kullanılmalıdır.
S = Atla. Bu kuralı atla.
T = Yaz. Döndürülen içeriğin mime türünü belirtin. Çok benzer AddType
direktif.
Bunu nasıl söylediğimi biliyorsun. RewriteCond
tek ve bir kural için geçerli midir? Eh, bunu zincirleme yaparak alabilirsiniz.
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, ilk yeniden yazma işlemi sırasında ikinci yeniden yazma kuralı yürütülür, önceki RewriteCond kuralı eşleştiğinde gerçekleşir. Apache düzenli ifadeler beyninizi incitirse Handy. Bununla birlikte, ilk bölümde işaret ettiğim hepsi bir arada yöntem I optimizasyon açısından daha hızlıdır.
RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html /newblog/$1/$2.shtml
Bu bayraklar yoluyla daha kolay yapılabilir:
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
Temel format nedir ve
mod_rewrite kurallarının yapısı?
Bu noktalarda sysadmin1138'in mükemmel yanıtını erteleyeceğim.
Düzenli form ve lezzet
ifadeler sağlam olmalı
avuçlamak?
Sözdizimi sırasına, sözdizimi eşleme / normal ifadelerine ve sysadmin1138 tarafından belirtilen RewriteRule işaretlerine ek olarak, mod_rewrite'nin Apache'nin HTTP istek başlıklarına ve Apache'nin yapılandırmasına dayalı ortam değişkenlerini gösterdiğine de dikkat çeker.
Ben tavsiye ederim AskApache's mod_rewrite Debug Eğitimi mod_rewrite için mevcut olabilecek kapsamlı bir değişken listesi için.
En yaygın olan ne
yeniden yazarken hatalar / tuzaklar
kurallar?
RewriteRule'un çoğu problemi, özel karakterlerden düzgün bir şekilde kaçmak için PCRE sözdizimi / başarısızlığının yanlış anlaşılmasından veya eşleştirmede kullanılan değişken (ler) in içeriğine dair bir içgörü bulunmamasından kaynaklanmaktadır.
Tipik sorunlar ve önerilen sorun giderme:
- 500 - Dahili Sunucu Hatası - Windows taşıma denetimlerini kaldır Varsa yapılandırma dosyasında / dosyalarında, mod_rewrite öğesinin etkin olduğundan emin olun.
IfModule
Bu senaryoyu engellemek şartıyla), problemi tespit edilene kadar direktif sözdizimini kontrol edin, direktifleri yorumlayın
- Yönlendirme döngüsü - Problem belirlene kadar RewriteLog ve RewriteLogLevel'den yararlanın, direktifleri yorumlayın
Test için iyi bir yöntem nedir ve
mod_rewrite kuralları doğrulanıyor mu?
Öncelikle, eşleşmeyi planladığınız ortam değişkenlerinin (içeriklerine) bakın. PHP yüklüyse, aşağıdaki bloğu uygulamanıza eklemek kadar basittir:
<?php
var_dump($_SERVER);
?>
... daha sonra kurallarınızı yazın (tercihen bir geliştirme sunucusunda test yapmak için) ve Apache'nizdeki tutarsız eşleşmeyi veya aktiviteyi not edin. ErrorLog dosya.
Daha karmaşık kurallar için mod_rewrite’i kullanın RewriteLog
etkinliğe bir dosyaya giriş ve yönlendirme yönergesi RewriteLogLevel 3
SEO veya performans var mı
mod_rewrite kurallarının anlamları I
Ya karşı dikkatli olunmalı?
AllowOverride all
Apache'nin kontrol etmesi gerektiğinden sunucu performansını etkiler .htaccess
Her istekte dosya ve ayrıştırma yönergeleri - mümkünse, siteniz için tüm yönergelerin VirtualHost yapılandırmasında kalmasını sağlayın veya etkinleştirin .htaccess
sadece onlara ihtiyaç duyan dizinler için geçersiz kılınır.
Google'ın Web Yöneticisi Yönergeleri Açıkça şunu belirtin: "Kullanıcılarınızı aldatmayın veya arama motorlarına farklı içerikler sunun. Bunlar genellikle" gizleme "olarak adlandırılır. Bu, arama motoru robotlarını filtreleyen mod_rewrite yönergelerini oluşturmaktan kaçınır.
Arama motoru robotları 1: 1 içeriği tercih eder: URI eşlemesi (bu, içeriğe bağlantı sıralama için temel oluşturur) - geçici yeniden yönlendirmeler oluşturmak için mod_rewrite kullanıyorsanız veya birden fazla URI'nin altında aynı içeriği sunuyorsanız, kurallı URI HTML belgelerinizde.
Yaygın durumlar var mı
mod_rewrite doğru gibi görünebilir
iş için araç ama değil mi?
Bu, kendi başına büyük (ve potansiyel olarak tartışmalı) bir konudur - vaka bazında kullanımları ele almak için daha iyi (IMHO) ve isteklerin önerilen kararların kendi ihtiyaçları için uygun olup olmadığını belirlemesine izin verir.
Bazı yaygın örnekler nelerdir?
AskApache's mod_rewrite Hileler ve İpuçları Düzenli olarak ortaya çıkan tüm yaygın kullanım durumlarını kapsar, bununla birlikte, belirli bir kullanıcı için "doğru" çözüm, kullanıcının yapılandırmasının ve mevcut yönergelerin karmaşıklığına bağlı olabilir (bu nedenle, genel olarak iyi bir fikir olduğunu diğer Bir mod_rewrite sorusu geldiğinde, bir kullanıcının sahip olduğu direktifler).
Birçok yönetici / geliştirici gibi, yıllardır yeniden yazma kurallarının inceliklerini tartışıyordum ve mevcut Apache dokümantasyonundan memnun kalmıyorum, bu yüzden kişisel bir proje olarak karar verdim. mod_rewrite
Aslında Apache çekirdeğinin geri kalanıyla çalışıyor ve etkileşime giriyor, bu yüzden son birkaç ay içinde strace
+ tüm bunları ele almak için kaynak kodun içine sondaj.
Kural geliştiricilerinin dikkate alması gerekenleri yeniden yazmanız gereken bazı önemli yorumlar şunlardır:
- Yeniden yazmanın bazı yönleri, sunucu yapılandırması, sanal ana bilgisayar, dizin, .htaccess işlemesi için yaygındır. ancak
- PerDir'in aksine bazı işlemler kök yapılandırması (sunucu yapılandırması, sanal konak ve dizin) için çok farklıdır (
.htaccess
) işleme.
- Daha da kötüsü, PerDir işlemenin neredeyse rasgele bir şekilde INTERNAL REDIRECT döngüsünü tetikleyebildiği için, root konfigürasyon öğelerinin böyle bir PerDir işleminin bunu tetikleyebileceğinin farkında olması gerekir.
Bunun nedeni olarak, neredeyse kullanıcı kullanıcı topluluklarını iki kategoriye ayırmanız ve bunları tamamen ayrı ele almanız gerektiğini söyleyeceğim.
Apache yapılandırmasına kök erişimi olanlar. Bunlar genellikle bir uygulama / sunucu / VM ile yönetici / geliştirici ve burada mesaj oldukça basittir: kullanmaktan kaçının .htaccess
dosyalar mümkün ise; sunucunuzda veya vhost yapılandırmanızda her şeyi yapın. Geliştirici hata ayıklamayı ayarlayabildiğinden ve rewrite.log dosyalarına erişebildiğinden hata ayıklama oldukça kolaydır.
Paylaşılan bir barındırılan hizmetin kullanıcıları (SHS).
- Bu kullanıcılar var kullanmak
.htaccess
/ Perdir işlenemediği için alternatif mevcut değildir.
- Daha da kötüsü, bu tür kullanıcıların yetenek seviyesi (mod_rewrite'nin regexp tabanlı merdiven-mantığını kullanabildiği sürece) genellikle deneyimli yöneticilerden önemli ölçüde daha azdır.
- Apache ve barındırma sağlayıcıları hata ayıklama / tanılama desteği sunmaz. Tek tanılama bilgisi, başarılı bir yönlendirme, yanlış URI'ye yönlendirme. veya 404/500 durum kodu. Bu onları karışık ve çaresiz bırakır.
- Apache, bu kullanım durumu için yeniden yazma işleminin nasıl çalıştığını açıklayan son derece zayıftır. Örneğin, PerDir'in net bir açıklamasını sağlamaz.
.htaccess
dosya seçildi ve neden. PerDir bisikletinin inceliklerini ve bundan nasıl kaçınılacağını açıklamıyor.
Muhtemelen üçüncü bir topluluk vardır: SHS sağlayıcılarının her iki kampta ayak izleyen ve yukarıdaki sonuçlara katlanmak zorunda kalan yönetici ve destek personeli.
Birkaç makale tarzı blog yazısı yazdım (ör. .Htaccess dosyalarında Rewrite kurallarını kullanma hakkında daha fazla bilgi) Bu yazıyı kısa tutmak için burada tekrarlamayacağım çok detaylı noktaları kapsar. Kendime ait ve VM FLOSS projelerini desteklemenin yanı sıra kendi paylaşımlı servisim var. SHS hesabım için bir test aracı olarak standart bir LAMP VM kullanarak başladım, ancak sonunda uygun bir ayna VM'si yapmanın daha iyi olduğunu buldum ( İşte).
Ancak, yönetici topluluğunun nasıl desteklemesi gerektiği konusunda .htaccess
kullanıcılar, geliştirmek ve sunmak için ihtiyacımız olduğunu hissediyorum:
Rewritemap kullanarak
Rewritemaps ile yapabileceğiniz pek çok şey var. Rewritemaps, Rewritemap yönergesi kullanılarak bildirilir ve daha sonra hem RewritCond değerlendirmelerinde hem de RewriteRule Subsitutions'da kullanılabilir.
RewriteMap için genel sözdizimi şöyledir:
RewriteMap MapName MapType:MapSource
Örneğin:
RewriteMap examplemap txt:/path/to/file/map.txt
Daha sonra harita adını bu gibi yapılar için kullanabilirsiniz:
${examplemap:key}
Harita anahtar / değer çiftleri içerir. Anahtar bulunursa, değer belirtilir. Basit haritalar sadece düz metin dosyalarıdır, ancak karma haritaları ve hatta SQL sorgularını kullanabilirsiniz. Daha fazla ayrıntı dokümanlar:
http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritemap
Unescaping dizeleri.
Bazı manipülasyonlar yapmak için kullanabileceğiniz dört dahili harita vardır. Özellikle unescaping dizeleri kullanışlı olabilir.
Örneğin: Sorgu dizesindeki "café" dizesini test etmek istiyorum. Ancak, tarayıcı sunucuma göndermeden önce bu durumdan kurtulacak, bu yüzden ya URL kaçtı sürümünün eşleştirmek istediğim her dize için ne olduğunu anlamaya ihtiyacım var, ya da sadece onu unescape ...
RewriteMap unescape int:unescape
RewriteCond %{QUERY_STRING} (location|place)=(.*)
RewriteCond ${unescape:%2} café
RewriteRule ^/find/$ /find/1234? [L,R]
Sorgu dizesi parametresine yalnızca argümanı yakalamak için bir RewriteCond kullandığımı ve daha sonra haritayı yeniden görüntülemek için ikinci yeniden yazım sırasında nasıl kullanacağımı unutmayın. Bu daha sonra karşılaştırılır.
Ayrıca,% 1'in "konum" veya "yer" i içereceği için, rewritemap'ta anahtar olarak% 2'ye nasıl ihtiyacımız olduğuna da dikkat edin. Kalıpları gruplandırmak için parantez kullandığınızda, yakalama sonucunu kullanmayı planlıyor olsanız da yakalanmayacaksınız.