Apache HTTP Sunucusu Sürüm 2.5

Bu belge, RewriteRule
yönergesinde kullanılabilecek bayrakları ayrıntılı açıklamalar ve
örneklerle açıklar.
Giriş
B (geri başvuruları kodla)
BNP|backrefnoplus (boşluğu +'ya kodlama)
BCTLS
BNE
C|chain
CO|cookie
DPI|discardpath
E|env
END
F|forbidden
G|gone
H|handler
L|last
N|next
NC|nocase
NE|noescape
NS|nosubreq
P|proxy
PT|passthrough
QSA|qsappend
QSD|qsdiscard
QSL|qslast
R|redirect
S|skip
T|type
UnsafeAllow3F
UnsafePrefixStat
UNCBir RewriteRule
yönergesinin davranışı bir veya daha fazla bayrakla
değiştirilebilir. Bayraklar kuralın sonunda köşeli parantez içinde
belirtilir ve birden fazla bayrak virgülle ayrılır.
RewriteRule pattern target [Flag1,Flag2,Flag3]
Her bayrağın (birkaç istisna dışında) CO gibi kısa bir
biçimi ve cookie gibi uzun bir biçimi vardır. Kısa biçim
en yaygın olarak kullanılsa da, her bayrağın ne yapması gerektiğini
hatırlamanız için uzun biçime aşina olmanız önerilir. Bazı bayraklar
bir veya daha fazla argüman alır. Bayraklar büyük/küçük harf
duyarsızdır.
İstekle ilişkili üstveriyi değiştiren bayraklar (T=, H=, E=), bir değiştirme ('-' dışında) aynı yeniden yazma işleme turunda gerçekleştirildiğinde dizin başına ve htaccess bağlamında etkili olmaz.
Burada mevcut bayrakların her biri, nasıl kullanabileceğinize dair bir örnekle birlikte sunulmaktadır.
[B] bayrağı, RewriteRule
yönergesine dönüşümü uygulamadan önce alfasayısal olmayan karakterleri
kodlamasını söyler.
mod_rewrite URL'leri eşlemeden önce kodlarını
çözmek zorundadır, bu nedenle geri başvurular uygulandığında kodları
çözülmüş olur. B bayrağı kullanıldığında, geri başvurulardaki
alfasayısal olmayan karakterler kodlanır. Örneğin, şu kuralı ele
alalım:
Sunucu değişkenlerinin benzer şekilde kodlanması için "escape" eşleme işlevine bakın
RewriteRule "^search/(.*)$" "/search.php?term=$1"
Arama terimi 'x & y/z' olduğunda, tarayıcı bunu
'x%20%26%20y%2Fz' olarak kodlar ve istek 'search/x%20%26%20y%2Fz'
olur. B bayrağı olmadan bu yeniden yazma kuralı 'search.php?term=x
& y/z' ile eşleşir ki bu geçerli bir URL değildir ve
search.php?term=x%20&y%2Fz= olarak kodlanır, bu da
amaçlanan değildir.
Aynı kuralda B bayrağı ayarlandığında, parametreler çıktı URL'sine
geçirilmeden önce yeniden kodlanır ve doğru bir eşleme olan
/search.php?term=x%20%26%20y%2Fz elde edilir.
RewriteRule "^search/(.*)$" "/search.php?term=$1" [B,PT]
Bu belirli örneğin çalışması için AllowEncodedSlashes yönergesini
On olarak ayarlamanız gerekebileceğini unutmayın; çünkü
httpd URL'lerde kodlanmış eğik çizgilere izin vermez ve bir tane
görürse 404 döndürür.
Bu kodlama özellikle vekil durumunda gereklidir; arka uç, kodları çözülmüş bir URL ile karşılaşırsa bozulabilir.
Bu bayrağa bir alternatif, %{THE_REQUEST} değerine karşı yakalama
yapan bir RewriteCond
kullanmaktır; bu, dizgeleri kodlanmış biçimde yakalar.
2.4.26 ve sonrasında, geri başvurulardaki kodlamayı belirli
karakterlerle sınırlayabilirsiniz: [B=#?;]. Not: Boşluk
karakteri kodlanacak karakterler listesinde kullanılabilir, ancak
RewriteRule yönergesinin
üçüncü argümanının tamamını tırnak içine almanız ve boşluğun listenin
son karakteri olmaması gerekir.
# Boşlukları ve soru işaretlerini kodla. Son argüman etrafındaki # tırnak işaretleri, boşluk dahil edildiğinde gereklidir. RewriteRule "^search/(.*)$" "/search.php?term=$1" "[B= ?]"
Bu şekilde kodlanan karakterleri sınırlamak için #flag_bne ve #flag_bctls bayraklarına bakın
[BNP] bayrağı, RewriteRule
yönergesine geri başvurulardaki boşluk karakterini '+' yerine %20
olarak kodlamasını söyler. Geri başvuru sorgu dizgesi yerine yol
bileşeninde kullanılacaksa yararlıdır.
# Form gönderimi yoluyla sorgu dizgesinde kullanılan + yerine yolda # boşlukları %20 olarak kodla RewriteRule "^search/(.*)$" "/search.php/$1" "[B,BNP]"
Bu bayrak 2.4.26 ve sonraki sürümlerde mevcuttur.
[BCTLS] bayrağı [B] bayrağına benzer, ancak yalnızca kontrol karakterlerini ve boşluk karakterini kodlar. Bu, sorgu dizgesine kodlanmadan kopyalandıklarında reddedilen karakter kümesiyle aynıdır.
# Kontrol karakterlerini ve boşlukları kodla RewriteRule "^search/(.*)$" "/search.php/$1" "[BCTLS]"
Bu bayrak 2.5.1 ve sonraki sürümlerde mevcuttur.
[BNE=...] içindeki karakter listesi, [B] veya [BCTLS] bayraklarının karakterlerinden istisna olarak değerlendirilir. Listelenen karakterler kodlanmayacaktır.
# Öntanımlı karakterleri kodla, ancak / karakterini bırak RewriteRule "^search/(.*)$" "/search.php?term=$1" "[B,BNE=/]"
Bu bayrak 2.5.1 ve sonraki sürümlerde mevcuttur.
[C] veya [chain] bayrağı, RewriteRule yönergesinin bir sonraki
kurala zincirleneceğini belirtir. Yani, kural eşleşirse her zamanki
gibi işlenir ve denetim bir sonraki kurala geçer. Ancak eşleşmezse bir
sonraki kural ve birlikte zincirlenen diğer kurallar atlanır.
[CO] veya [cookie] bayrağı, belirli bir RewriteRule eşleştiğinde bir çerez
ayarlamanıza olanak tanır. Argüman üç zorunlu ve beş isteğe bağlı
alandan oluşur.
Bayrağın tüm öznitelikler dahil tam sözdizimi şöyledir:
[CO=NAME:VALUE:DOMAIN:lifetime:path:secure:httponly:samesite]
Çerez alanlarından herhangi birinde birebir ':' karakterine ihtiyaç duyulursa, alternatif bir sözdizimi mevcuttur. Alternatif sözdizimini etkinleştirmek için çerez "Name" alanının önüne ';' karakteri konulmalı ve alan ayırıcıları ';' olarak belirtilmelidir.
[CO=;NAME;VALUE:MOREVALUE;DOMAIN;lifetime;path;secure;httponly;samesite]
Çerezin ayarlanması için bir ad, bir değer ve bir alan adı bildirmelisiniz.
www.example.com gibi bir konak adı veya
.example.com gibi bir alan adı olabilir. En az iki
parçadan oluşmalı ve bir nokta ile ayrılmalıdır. Yani yalnızca
.com veya .net olamaz. Bu tür çerezler
çerez güvenlik modeli tarafından yasaklanmıştır.İsteğe bağlı olarak aşağıdaki değerleri de ayarlayabilirsiniz:
/customers/ veya /files/download/ gibi./ olarak ayarlanır - yani web
sitesinin tamamı.secure, true veya 1 olarak
ayarlanırsa, çerez yalnızca güvenli (https) bağlantılar üzerinden
aktarılabilir.HttpOnly, true veya 1
olarak ayarlanırsa, çerez HttpOnly bayrağıyla
ayarlanır; bu, çerezin bu özelliği destekleyen tarayıcılarda
JavaScript koduna erişilemez olduğu anlamına gelir.false veya 0 dışında bir değere
ayarlanırsa, SameSite özniteliği belirtilen değere
ayarlanır. Tipik değerler None, Lax ve
Strict'tir. 2.5.1 ve sonrasında mevcuttur.Şu örneği ele alalım:
RewriteEngine On RewriteRule "^/index\.html" "-" [CO=frontdoor:yes:.example.com:1440:/]
Verilen örnekte, kural isteği yeniden yazmaz. "-" yeniden yazma
hedefi, mod_rewrite modülüne isteği değiştirmeden
geçirmesini söyler. Bunun yerine, 'frontdoor' adlı bir çerezi 'yes'
değeriyle ayarlar. Çerez .example.com alan adındaki
herhangi bir konak için geçerlidir. 1440 dakika (24 saat) sonra sona
erecek şekilde ayarlanır ve tüm URI'ler için döndürülür.
DPI bayrağı, yeniden yazılmış URI'nin PATH_INFO bölümünün atılmasına neden olur.
Bu bayrak 2.2.12 ve sonraki sürümlerde mevcuttur.
Dizin başına bağlamda, her RewriteRule
yönergesinin karşılaştırdığı URI, URI'nin ve PATH_INFO'nun geçerli
değerlerinin birleşimidir.
Geçerli URI, istemcinin istediği ilk URI, önceki bir
mod_rewrite işleme turunun sonucu veya geçerli
mod_rewrite işleme turundaki önceki bir kuralın
sonucu olabilir.
Buna karşılık, her kuraldan önce URI'ye eklenen PATH_INFO yalnızca
bu mod_rewrite işleme turundan önceki PATH_INFO
değerini yansıtır. Sonuç olarak, URI'nin büyük bölümleri birden fazla
RewriteRule yönergesinde bir değiştirmeye
eşlenip kopyalanırsa ve URI'nin hangi bölümlerinin geçerli
PATH_INFO'dan geldiğine dikkat edilmezse, son URI'ye PATH_INFO'nun
birden fazla kopyası eklenebilir.
Bu bayrağı, önceki dosya sistemi eşlemesinden kaynaklanan
PATH_INFO'nun ilgilendirmediği herhangi bir değiştirmede kullanın. Bu
bayrak, bu mod_rewrite işleme turu başlamadan önce
oluşturulan PATH_INFO'yu kalıcı olarak unutur. PATH_INFO, geçerli
mod_rewrite işleme turu tamamlanana kadar yeniden
hesaplanmaz. Bu tur boyunca sonraki kurallar, yalnızca değiştirmelerin
doğrudan sonucunu görür; eklenmiş bir PATH_INFO olmaz.
[E] veya [env] bayrağıyla bir ortam değişkeninin değerini ayarlayabilirsiniz. Bazı ortam değişkenlerinin kural çalıştıktan sonra ayarlanabileceğini ve böylece ayarladığınız değeri geçersiz kılabileceğini unutmayın. Ortam değişkenlerinin nasıl çalıştığı hakkında daha fazla ayrıntı için Ortam Değişkenleri belgesine bakın.
Bu bayrağın tam sözdizimi şöyledir:
[E=VAR:VAL] [E=!VAR]
VAL, genişletilen geri başvurular ($N
veya %N) içerebilir.
Kısa biçimi kullanarak
[E=VAR]
VAR adlı ortam değişkenini boş bir değere
ayarlayabilirsiniz.
Şu biçim
[E=!VAR]
daha önce ayarlanmış VAR adlı ortam değişkeninin
silinmesine olanak tanır.
Ortam değişkenleri daha sonra CGI programları, diğer RewriteRule yönergeleri veya CustomLog yönergeleri dahil olmak üzere çeşitli bağlamlarda kullanılabilir.
Aşağıdaki örnek, istenen URI bir resim dosyasıysa 'image' adlı bir ortam değişkenini '1' değerine ayarlar. Daha sonra bu ortam değişkeni, bu istekleri erişim günlüğünden dışlamak için kullanılır.
RewriteRule "\.(png|gif|jpg)$" "-" [E=image:1] CustomLog "logs/access_log" combined env=!image
Aynı etkinin SetEnvIf
kullanılarak elde edilebileceğini unutmayın. Bu teknik bir öneri olarak
değil, bir örnek olarak sunulmuştur.
[END] bayrağı kullanmak, yalnızca geçerli yeniden yazma işleme turunu durdurmakla kalmaz ([L] gibi), aynı zamanda dizin başına (htaccess) bağlamda sonraki yeniden yazma işlemlerinin de gerçekleşmesini engeller.
Bu, harici yönlendirmelerden kaynaklanan yeni istekler için geçerli değildir.
[F] bayrağı kullanmak, sunucunun istemciye 403 Yasak durum kodu
döndürmesine neden olur. Aynı davranış Deny yönergesiyle de
gerçekleştirilebilir ancak bu, Yasak durumu atamada daha fazla esneklik
sağlar.
Aşağıdaki kural, .exe dosyalarının sunucunuzdan
indirilmesini yasaklar.
RewriteRule "\.exe" "-" [F]
Bu örnek, yeniden yazma hedefi için "-" sözdizimini kullanır; bu, istenen URI'nin değiştirilmediği anlamına gelir. İsteği yasaklayacaksanız başka bir URI'ye yeniden yazmanın bir nedeni yoktur.
[F] kullanıldığında, [L] zımnen uygulanır - yani yanıt hemen döndürülür ve başka kural değerlendirilmez.
[G] bayrağı, sunucuyu yanıtla birlikte 410 Kalktı durum kodu döndürmeye zorlar. Bu, bir kaynağın eskiden mevcut olduğunu ancak artık mevcut olmadığını belirtir.
[F] bayrağında olduğu gibi, [G] bayrağını kullanırken genellikle yeniden yazma hedefi için "-" sözdizimini kullanırsınız:
RewriteRule "oldproduct" "-" [G,NC]
[G] kullanıldığında, [L] zımnen uygulanır - yani yanıt hemen döndürülür ve başka kural değerlendirilmez.
Elde edilen isteğin belirtilen işleyici ile işlenmesini zorlar. Örneğin, dosya uzantısı olmayan tüm dosyaların php işleyicisi tarafından çözümlenmesini zorlamak için kullanılabilir:
RewriteRule "!\." "-" [H=application/x-httpd-php]
Yukarıdaki düzenli ifade - !\. - birebir .
karakterini içermeyen herhangi bir istekle eşleşir.
Bu, bazı koşullara dayalı olarak işleyiciyi zorlamak için de
kullanılabilir. Örneğin, sunucu bağlamında kullanılan aşağıdaki
kod parçası, .phps uzantısıyla istendiğinde
.php dosyalarının mod_php tarafından
görüntülenmesini sağlar:
RewriteRule "^(/source/.+\.php)s$" "$1" [H=application/x-httpd-php-source]
Yukarıdaki düzenli ifade - ^(/source/.+\.php)s$ -
/source/ ile başlayan, ardından 1 veya n karakter gelen
ve birebir .phps ile biten herhangi bir istekle eşleşir.
$1 geri başvurusu, düzenli ifadenin parantez içindeki yakalanan
eşleşmeye referans verir.
[L] bayrağı, mod_rewrite modülünün kural kümesini
işlemeyi durdurmasına neden olur. Çoğu bağlamda, kural eşleşirse başka
kural işlenmeyeceği anlamına gelir. Bu, Perl'deki last
komutuna veya C'deki break komutuna karşılık gelir. Bu
bayrağı, geçerli kuralın diğer kurallar dikkate alınmadan hemen
uygulanması gerektiğini belirtmek için kullanın.
RewriteRule yönergesini
.htaccess dosyalarında veya <Directory> bölümlerinde kullanıyorsanız,
kuralların nasıl işlendiğini anlamanız önemlidir. Bunun basitleştirilmiş
biçimi, kurallar işlendikten sonra yeniden yazılmış isteğin URL
çözümleme motoruna geri verildiğidir. Yeniden yazılmış istek
işlenirken .htaccess dosyası veya <Directory> bölümüyle tekrar karşılaşılması
ve kural kümesinin baştan çalıştırılması mümkündür. En yaygın olarak
bu, kurallardan birinin dahili veya harici bir yönlendirmeye neden
olması durumunda olur ve istek sürecinin yeniden başlamasına yol
açar.
Bu nedenle, RewriteRule
yönergelerini bu bağlamlardan birinde kullanıyorsanız, kuralların
döngüye girmesinden kaçınmak için açık adımlar atmanız ve bir dizi
kuralın yürütülmesini sonlandırmak için yalnızca [L] bayrağına
güvenmemeniz önemlidir; aşağıda gösterildiği gibi.
Alternatif bir bayrak olan [END], yalnızca geçerli yeniden yazma işleme turunu sonlandırmak için değil, aynı zamanda dizin başına (htaccess) bağlamda sonraki yeniden yazma işlemlerinin de gerçekleşmesini engellemek için kullanılabilir. Bu, harici yönlendirmelerden kaynaklanan yeni istekler için geçerli değildir.
Burada verilen örnek, herhangi bir isteği index.php'ye
yeniden yazar ve orijinal isteği index.php'ye sorgu
dizgesi argümanı olarak verir; ancak RewriteCond, istek zaten
index.php için ise RewriteRule yönergesinin
atlanmasını sağlar.
RewriteBase "/"
RewriteCond "%{REQUEST_URI}" !=/index.php
RewriteRule "^(.*)" "/index.php?req=$1" [L,PT]
[N] bayrağı, kural kümesinin şimdiye kadarki sonucu başlangıç noktası olarak kullanarak en baştan yeniden başlamasına neden olur. Döngüye neden olabileceğinden son derece dikkatli kullanın.
[Next] bayrağı, örneğin bir istekteki belirli bir dizgeyi veya harfi tekrar tekrar değiştirmek istediğinizde kullanılabilir. Burada gösterilen örnek, bir istekteki her yerde A'yı B ile değiştirecek ve değiştirilecek A kalmayana kadar bunu yapmaya devam edecektir.
RewriteRule "(.*)A(.*)" "$1B$2" [N]
Bunu bir while döngüsü olarak düşünebilirsiniz: Bu
kalıp hâlâ eşleştiği sürece (yani URI hâlâ bir A
içerdiği sürece), bu değiştirmeyi yap (yani A'yı
B ile değiştir).
2.5.0 ve sonrasında, bu modül istenmeyen döngülere karşı koruma sağlamak için 10.000 yinelemeden sonra hata döndürür. N bayrağına eklenerek alternatif bir maksimum yineleme sayısı belirtilebilir.
# Döngünün her geçişinde 1 karakter değiştirmeye razı ol RewriteRule "(.+)[><;]$" "$1" [N=32000] # ... veya 10 döngüden sonra vazgeç RewriteRule "(.+)[><;]$" "$1" [N=10]
[NC] bayrağının kullanımı, RewriteRule yönergesinin büyük/küçük
harf duyarsız biçimde eşleştirilmesine neden olur. Yani eşleşen
URI'de harflerin büyük veya küçük harf olarak görünüp görünmediği
önemli değildir.
Aşağıdaki örnekte, herhangi bir resim dosyası isteği özel resim
sunucunuza vekil olarak iletilir. Eşleşme büyük/küçük harf
duyarsızdır; bu nedenle örneğin hem .jpg hem de
.JPG dosyaları kabul edilir.
RewriteRule "(.*\.(jpg|gif|png))$" "http://images.example.com$1" [P,NC]
Öntanımlı olarak, bir RewriteRule harici yönlendirmeyle
sonuçlandığında, çıktıda aşağıdaki güvenli küme dışında kalan
karakterler onaltılık kod (yüzde kodlu) eşdeğerlerine
dönüştürülür:
A-Z, a-z,
0-9$-_.+!*'(),:;@&=/~Örneğin, # karakteri %23'e ve
? karakteri %3F'e dönüştürülür.
% karakteri de kodlanır (%25'e), bu da
değiştirmede zaten mevcut olan yüzde kodlamanın çift kodlanacağı
anlamına gelir.
[NE] bayrağı kullanmak bu kodlamayı engeller ve # ile
? gibi karakterlerin yönlendirme URL'sine
değiştirilmeden geçmesine olanak tanır.
RewriteRule "^/anchor/(.+)" "/bigpage.html#$1" [NE,R]
Yukarıdaki örnek /anchor/xyz adresini
/bigpage.html#xyz adresine yönlendirecektir. [NE]
kullanılmazsa # karakteri onaltılık kod eşdeğeri olan
%23'e dönüştürülür ve bu da 404 Bulunamadı hata durumuna
yol açar.
[NS] bayrağının kullanımı, kuralın alt isteklerde kullanılmasını
engeller. Örneğin, SSI (Sunucu Tarafı Dahil Etme) kullanılarak dahil
edilen bir sayfa bir alt istektir ve bu alt isteklerde yeniden
yazmaların gerçekleşmesini engellemek isteyebilirsiniz. Ayrıca,
mod_dir olası dizin öntanımlı dosyaları (örneğin
index.html dosyaları) hakkında bilgi edinmeye
çalıştığında, bu bir dahili alt istektir ve genellikle bu tür alt
isteklerde yeniden yazmaları engellemek istersiniz. Alt isteklerde,
kuralların tamamının uygulanması her zaman yararlı olmaz ve hatalara
bile neden olabilir. Sorunlu kuralları dışlamak için bu bayrağı
kullanın.
Bu kuralı kullanıp kullanmamaya karar vermek için: URL'leri CGI betikleriyle ön ekliyorsanız ve bunların CGI betiği tarafından işlenmesini zorluyorsanız, alt isteklerde sorunlarla (veya önemli ek yükle) karşılaşmanız olasıdır. Bu durumlarda bu bayrağı kullanın.
Bir HTML sayfasının parçası olarak yüklenen resimler, javascript dosyaları veya css dosyaları alt istek değildir - tarayıcı bunları ayrı HTTP istekleri olarak ister.
[P] bayrağının kullanımı, isteğin mod_proxy
tarafından işlenmesine ve bir vekil isteği üzerinden ele alınmasına
neden olur. Örneğin, tüm resim isteklerinin bir arka uç resim
sunucusu tarafından işlenmesini istiyorsanız, şöyle bir şey
yapabilirsiniz:
RewriteRule "/(.*)\.(jpg|gif|png)$" "http://images.example.com/$1.$2" [P]
[P] bayrağının kullanımı [L] anlamına gelir - yani istek hemen vekil üzerinden iletilir ve sonraki kurallar dikkate alınmaz.
Değiştirme dizgesinin mod_proxy tarafından
işlenebilecek geçerli bir URI olduğundan (genellikle
http://konakadı ile başlayan) emin olmalısınız.
Değilse, vekil modülünden bir hata alırsınız. Bu bayrağı, uzak
içeriği yerel sunucunun ad alanına eşlemek için ProxyPass yönergesinin daha güçlü
bir uygulamasını gerçekleştirmek için kullanın.
Kuralın hedef URL'sini oluştururken, istemcinin sunucunuzun vekil olarak davranacağı URL kümesi üzerindeki etkisinin güvenlik sonuçlarını dikkate alın. URL'nin şema ve konak adı bölümünün ya sabit olduğundan ya da istemciye gereksiz etki izni vermediğinden emin olun.
Bu bayrağı kullanmak, kalıcı bağlantıları yönetmeyen öntanımlı
işçi bu durumda kullanıldığından bağlantı havuzlama/yeniden kullanımı
olmaksızın mod_proxy kullanımını tetikler.
Kalıcı bağlantıları kullanmak için en azından hedef URL'nin şema
ve konak bölümü için örneğin bir zaman aşımı ayarladığınız
ProxySet yönergesi içeren
bir Proxy bloğu
kurmalısınız.
ProxyPass veya
ProxyPassMatch ile
kurarsanız kalıcı bağlantılar otomatik olarak kullanılacaktır.
Not: Bu bayrağı kullanmak için mod_proxy
etkinleştirilmiş olmalıdır.
Bir RewriteRule'daki hedef (veya değiştirme dizgesi) öntanımlı olarak
bir dosya yolu olarak kabul edilir. [PT] bayrağının kullanılması,
bunun yerine bir URI olarak işlenmesine neden olur. Yani, [PT]
bayrağının kullanılması, RewriteRule sonucunun, Alias, Redirect veya ScriptAlias gibi konum tabanlı
eşlemelerin etki edebilmesi için URL eşlemesine geri iletilmesine
neden olur.
Örneğin, /icons için bir Alias tanımınız varsa ve oraya
işaret eden bir RewriteRule varsa, Alias yönergesinin
değerlendirilmesini sağlamak için [PT] bayrağını kullanmalısınız.
Alias "/icons" "/usr/local/apache/icons" RewriteRule "/pics/(.+)\.jpg$" "/icons/$1.gif" [PT]
Bu durumda [PT] bayrağının atlanması, Alias'ın yok sayılmasına neden olur ve 'Dosya bulunamadı' hatası döndürülür.
PT bayrağı L bayrağını ima eder:
isteği bir sonraki işleme aşamasına geçirmek için yeniden yazma
durdurulur.
PT bayrağının <Directory> bölümleri veya
.htaccess dosyaları gibi dizin başına bağlamlarda
zımnen uygulandığını unutmayın. Bundan kaçınmanın tek yolu
-'ye yeniden yazmaktır.
Değiştirme URI'si bir sorgu dizgesi içerdiğinde, RewriteRule yönergesinin öntanımlı
davranışı mevcut sorgu dizgesini atıp yeni oluşturulanla
değiştirmektir. [QSA] bayrağı kullanmak sorgu dizgelerinin
birleştirilmesine neden olur.
Şu kuralı ele alalım:
RewriteRule "/pages/(.+)" "/page.php?page=$1" [QSA]
[QSA] bayrağıyla, /pages/123?one=two isteği
/page.php?page=123&one=two ile eşlenir. [QSA]
bayrağı olmadan, aynı istek
/page.php?page=123 ile eşlenir - yani mevcut sorgu
dizgesi atılır.
İstenen URI bir sorgu dizgesi içerdiğinde ve hedef URI içermediğinde,
RewriteRule yönergesinin
öntanımlı davranışı o sorgu dizgesini hedef URI'ye kopyalamaktır.
[QSD] bayrağı kullanmak sorgu dizgesinin atılmasına neden olur.
Bu bayrak 2.4.0 ve sonraki sürümlerde mevcuttur.
[QSD] ve [QSA] birlikte kullanıldığında [QSD] öncelikli olur.
Hedef URI bir sorgu dizgesine sahipse, öntanımlı davranış
gözlemlenir - yani orijinal sorgu dizgesi atılır ve
RewriteRule hedef URI'sindeki sorgu dizgesiyle
değiştirilir.
Öntanımlı olarak, değiştirmedeki ilk (en soldaki) soru işareti yolu
sorgu dizgesinden ayırır. [QSL] bayrağı kullanmak, RewriteRule yönergesine iki bileşeni
son (en sağdaki) soru işaretini kullanarak ayırmasını söyler.
Bu, dosya adlarında birebir soru işaretleri bulunan dosyalara eşleme yaparken yararlıdır. Değiştirmede sorgu dizgesi kullanılmıyorsa, bu bayrakla birlikte sonuna bir soru işareti eklenebilir.
Bu bayrak 2.4.19 ve sonraki sürümlerde mevcuttur.
[R] bayrağı kullanmak, tarayıcıya bir HTTP yönlendirmesi
verilmesine neden olur. Tam nitelikli bir URL belirtilmişse (yani
http://sunucuadı/ dahil), o konuma bir yönlendirme
verilir. Aksi takdirde, yönlendirmeyle gönderilen URL'yi oluşturmak
için geçerli protokol, sunucu adı ve bağlantı noktası numarası
kullanılır.
[R=305] sözdizimi kullanılarak geçerli herhangi bir HTTP yanıt durum
kodu belirtilebilir; hiçbiri belirtilmezse öntanımlı olarak 302 durum
kodu kullanılır. Belirtilen durum kodunun mutlaka bir yönlendirme
(3xx) durum kodu olması gerekmez. Ancak durum kodu yönlendirme
aralığının (300-399) dışındaysa değiştirme dizgesi tamamen atılır ve
L kullanılmış gibi yeniden yazma durdurulur.
Yanıt durum kodlarına ek olarak, yönlendirme durumunu sembolik
adlarıyla da belirtebilirsiniz: temp (öntanımlı),
permanent veya seeother.
[R] bayrağını neredeyse her zaman [L] ile birlikte kullanmak
istersiniz (yani [R,L] kullanın); çünkü [R] bayrağı tek başına
URI'nin önüne http://bukonak[:buport] ekler ancak bunu
kural kümesindeki bir sonraki kurala geçirir ve bu da çoğu zaman
'İstekte Geçersiz URI' uyarılarına neden olabilir.
Not: httpd yalnızca HTTP belirtiminde bulunan durum kodlarını destekler. Tanınmayan bir durum kodu kullanmak 500 hatasına ve hata günlüğü mesajına neden olacaktır.
[S] bayrağı, çalıştırmak istemediğiniz kuralları atlamak için
kullanılır. Atlama bayrağının sözdizimi [S=N]'dir; burada
N atlanacak kural sayısını belirtir (RewriteRule ve ondan önceki
RewriteCond yönergeleri
eşleştiği takdirde). Bu, yeniden yazma kural kümenizde bir
goto deyimi olarak düşünülebilir. Aşağıdaki örnekte,
RewriteRule yönergesini
yalnızca istenen URI gerçek bir dosyaya karşılık gelmiyorsa
çalıştırmak istiyoruz.
# İstek var olmayan bir dosya için mi?
RewriteCond "%{REQUEST_FILENAME}" !-f
RewriteCond "%{REQUEST_FILENAME}" !-d
# Öyleyse, bu iki RewriteRule'u atla
RewriteRule ".?" "-" [S=2]
RewriteRule "(.*\.gif)" "images.php?$1"
RewriteRule "(.*\.html)" "docs.php?$1"
Bu teknik yararlıdır; çünkü bir RewriteCond yalnızca hemen ardından
gelen RewriteRule için
geçerlidir. Bu nedenle, bir RewriteCond'un birkaç
RewriteRule için geçerli olmasını istiyorsanız, olası
bir teknik bu koşulları olumsuzlamak ve [Skip] bayrağıyla bir
RewriteRule eklemektir. Bunu, sözde if-then-else
yapıları oluşturmak için kullanabilirsiniz: then yan tümcesinin son
kuralı skip=N olur; burada N, else yan tümcesindeki
kural sayısıdır:
# Dosya var mı?
RewriteCond "%{REQUEST_FILENAME}" !-f
RewriteCond "%{REQUEST_FILENAME}" !-d
# "else" kısmına gitmek istiyorsak 3 satır atlayarak bir if-then-else yapısı oluştur.
RewriteRule ".?" "-" [S=3]
# EĞER dosya varsa:
RewriteRule "(.*\.gif)" "images.php?$1"
RewriteRule "(.*\.html)" "docs.php?$1"
# "else" kısmını atla.
RewriteRule ".?" "-" [S=1]
# DEĞİLSE...
RewriteRule "(.*)" "404.php?file=$1"
# SON
Bu tür yapılandırmayı, bunun yerine <If>, <ElseIf> ve <Else> yönergelerini kullanarak
gerçekleştirmek muhtemelen daha kolaydır.
Elde edilen yanıtın gönderileceği MIME türünü ayarlar. Bu,
AddType yönergesiyle aynı
etkiye sahiptir.
Örneğin, Perl kaynak kodunu belirli bir şekilde istendiğinde düz metin olarak sunmak için aşağıdaki tekniği kullanabilirsiniz:
# .pl dosyalarını düz metin olarak sun RewriteRule "\.pl$" "-" [T=text/plain]
Veya dosya uzantısı olmayan jpeg resimleri üreten bir kameranız varsa, bu resimlerin dosya adlarına bakarak doğru MIME türüyle sunulmasını zorlayabilirsiniz:
# Adında 'IMG' bulunan dosyalar jpg resimlerdir. RewriteRule "IMG" "-" [T=image/jpg]
Bunun önemsiz bir örnek olduğunu ve bunun yerine <FilesMatch> kullanılarak
daha iyi yapılabileceğini lütfen unutmayın. Yeniden yazmaya
başvurmadan önce her zaman bir soruna alternatif çözümleri
düşünün; yeniden yazma her zaman alternatiflerden daha az verimli
bir çözüm olacaktır.
Dizin başına bağlamda kullanılıyorsa, mod_rewrite
işlemesinin tüm turu boyunca değiştirme olarak yalnızca
- (tire) kullanın; aksi takdirde dahili yeniden
işleme (sonraki mod_rewrite işleme turları dahil)
nedeniyle bu bayrakla ayarlanan MIME türü kaybolur.
L bayrağı bu bağlamda mod_rewrite
işlemesinin geçerli turunu sonlandırmak için yararlı
olabilir.
Yazılmakta olan HTTP isteğinde kodlanmış bir soru işareti '%3f' varsa ve yeniden yazılmış sonucun değiştirmesinde '?' varsa, yeniden yazmanın devam etmesine izin vermek için bu bayrağın ayarlanması gereklidir. Bu, kodlanmış soru işaretinin yakalanması ve yeniden değiştirilmesinden yararlanan kötü niyetli bir URL'ye karşı koruma sağlar.
Sunucu kapsamlı değiştirmeler bir değişken veya geri başvuru ile başlayıp bir dosya sistemi yoluna çözümlendiğinde bu bayrağın ayarlanması gereklidir. Bu değiştirmeler belge kökü ile öneklenmez. Bu, genişletilmiş değiştirmenin beklenmeyen bir dosya sistemi konumuna eşlenmesine neden olan kötü niyetli bir URL'ye karşı koruma sağlar.
Available in Apache HTTP Server 2.5.1 and later.