blob: 98132965d1cc212e8f78845b956a15cef8bb2807 [file]
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE manualpage SYSTEM "../style/manualpage.dtd">
<?xml-stylesheet type="text/xsl" href="../style/manual.tr.xsl"?>
<!-- English Revision: 1933438:1935430 (outdated) -->
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<manualpage metafile="tech.xml.meta">
<parentdocument href="./">Rewrite</parentdocument>
<title>Apache mod_rewrite Teknik Ayrıntıları</title>
<summary>
<p>Bu belge, <module>mod_rewrite</module> ve URL eşleştirmesinin bazı
teknik ayrıntılarını tartışır.</p>
</summary>
<seealso><a href="../mod/mod_rewrite.html">Modül belgeleri</a></seealso>
<seealso><a href="intro.html">mod_rewrite'a giriş</a></seealso>
<seealso><a href="remapping.html">Yeniden yönlendirme ve yeniden eşleme</a></seealso>
<seealso><a href="access.html">Erişim denetimi</a></seealso>
<seealso><a href="vhosts.html">Sanal konaklar</a></seealso>
<seealso><a href="proxy.html">Vekil kullanımı</a></seealso>
<seealso><a href="rewritemap.html">RewriteMap Kullanımı</a></seealso>
<seealso><a href="advanced.html">İleri teknikler</a></seealso>
<seealso><a href="avoid.html">mod_rewrite kullanılmaması gereken durumlar</a></seealso>
<section id="InternalAPI"><title>API Aşamaları</title>
<p>Apache HTTP Sunucusu, istekleri birkaç aşamada işler. Bu
aşamaların her birinde, istek yaşam döngüsünün o bölümünü
işlemek üzere bir veya daha fazla modül çağrılabilir. Aşamalar
URL-dosyaadı çevirisi, kimlik doğrulama, yetkilendirme, içerik
ve günlükleme gibi şeyleri içerir. (Bu kapsamlı bir liste
değildir.)</p>
<p><module>mod_rewrite</module>, URL'lerin nasıl yeniden
yazılabileceğini etkilemek için bu aşamalardan ikisinde (veya
sıklıkla çağrıldıkları şekliyle "kancalarda") çalışır.</p>
<p>İlk olarak, HTTP isteği okunduktan sonra ancak herhangi bir
yetkilendirme başlamadan önce gerçekleşen URL-dosyaadı çevirisi
kancasını kullanır. İkinci olarak, yetkilendirme aşamalarından
sonra ve dizin başına yapılandırma dosyaları
(<code>.htaccess</code> dosyaları) okunduktan sonra ancak içerik
işleyicisi çağrılmadan önce gerçekleşen Düzeltme (Fixup)
kancasını kullanır.</p>
<p>Bir istek geldikten ve karşılık gelen sunucu veya sanal konak
belirlendikten sonra, yeniden yazma motoru sunucu başına
yapılandırmada görünen <module>mod_rewrite</module> yönergelerini
işlemeye başlar. (Yani ana sunucu yapılandırma dosyası ve
<directive module="core" type="section">Virtualhost</directive>
bölümleri.) Bu, URL-dosyaadı aşamasında gerçekleşir.</p>
<p>Birkaç adım sonra, son veri dizinleri bulunduktan sonra dizin
başına yapılandırma yönergeleri (<code>.htaccess</code> dosyaları
ve <directive module="core" type="section">Directory</directive>
blokları) uygulanır. Bu, Düzeltme aşamasında gerçekleşir.</p>
<p>Bu durumların her birinde <module>mod_rewrite</module>,
<code>REQUEST_URI</code>'yi ya yeni bir URL'ye ya da bir dosya
adına yeniden yazar.</p>
<p>Dizin başına bağlamda (yani <code>.htaccess</code> dosyaları ve
<code>Directory</code> blokları içinde) bu kurallar, bir URL
zaten bir dosya adına çevrilmiş olduktan sonra uygulanır. Bu
nedenle, <module>mod_rewrite</module> modülünün <directive
module="mod_rewrite">RewriteRule</directive> yönergelerini
başlangıçta karşılaştırdığı URL yolu, çevrilen dosya adının tam
dosya sistemi yolu olup geçerli dizin yolu (sondaki eğik çizgi
dahil) öndeki kısımdan çıkarılmıştır.</p>
<p>Göstermek gerekirse: Kurallar /var/www/foo/.htaccess içindeyse
ve /foo/bar/baz isteği işleniyorsa, ^bar/baz$ gibi bir ifade
eşleşecektir.</p>
<p>Dizin başına bağlamda bir değiştirme yapılırsa, yeni URL ile
yeni bir dahili alt istek verilir ve bu da istek aşamalarının
işlenmesini yeniden başlatır. Değiştirme göreli bir yolsa,
<directive module="mod_rewrite">RewriteBase</directive> yönergesi
değiştirmenin önüne eklenen URL yolu önekini belirler. Dizin
başına bağlamda, döngüyü önlemek için sonunda (gelecekteki bir
dizin başına yeniden yazma işleme "turunda") değiştirme yapmayan
kurallar oluşturmaya dikkat edilmelidir. (Bu sorunun daha ayrıntılı
tartışması için <a
href="https://cwiki.apache.org/confluence/display/httpd/RewriteLooping">RewriteLooping</a>
sayfasına bakın.)</p>
<p>Dizin başına bağlamda URL'nin bu ek işlenmesi nedeniyle, bu
bağlamda yeniden yazma kurallarınızı farklı şekilde oluşturmaya
dikkat etmeniz gerekecektir. Özellikle, baştaki dizin yolunun
yeniden yazma kurallarınızın göreceği URL'den çıkarılacağını
unutmayın. Daha fazla açıklama için aşağıdaki örneklere bakın.</p>
<table border="1">
<tr>
<th>Kuralın konumu</th>
<th>Kural</th>
</tr>
<tr>
<td>VirtualHost bölümü</td>
<td>RewriteRule "^/images/(.+)\.jpg" "/images/$1.gif"</td>
</tr>
<tr>
<td>Belge kökündeki .htaccess dosyası</td>
<td>RewriteRule "^images/(.+)\.jpg" "images/$1.gif"</td>
</tr>
<tr>
<td>images dizinindeki .htaccess dosyası</td>
<td>RewriteRule "^(.+)\.jpg" "$1.gif"</td>
</tr>
</table>
<p><module>mod_rewrite</module> modülünün farklı bağlamlarda
URL'leri nasıl değiştirdiği hakkında daha fazla bilgi için,
yeniden yazma sırasında oluşturulan <a
href="../mod/mod_rewrite.html#logging">günlük kayıtlarına</a>
başvurmalısınız.</p>
</section>
<section id="InternalRuleset"><title>Kural Kümesi İşleme</title>
<p>Şimdi <module>mod_rewrite</module> bu iki API aşamasında
tetiklendiğinde, yapılandırılmış kural kümelerini yapılandırma
yapısından okur (bu yapı sunucu başına bağlam için başlangıçta
veya dizin başına bağlam için Apache çekirdeğinin dizin
yürüyüşü sırasında oluşturulmuştur). Ardından URL yeniden
yazma motoru içerilen kural kümesiyle (bir veya daha fazla kural
ve bunların koşulları birlikte) başlatılır. URL yeniden yazma
motorunun çalışması her iki yapılandırma bağlamı için de
tamamen aynıdır. Yalnızca nihai sonuç işleme farklıdır.</p>
<p>Kural kümesindeki kuralların sırası önemlidir; çünkü yeniden
yazma motoru bunları özel (ve çok belirgin olmayan) bir sırada
işler. Kural şudur: Yeniden yazma motoru kural kümesini kural
kural (<directive module="mod_rewrite">RewriteRule</directive>
yönergeleri) döner ve belirli bir kural eşleştiğinde isteğe
bağlı olarak karşılık gelen koşulları (<code>RewriteCond</code>
yönergeleri) döner. Tarihsel nedenlerle koşullar önce verilir
ve bu nedenle kontrol akışı biraz dolambaçlıdır. Daha fazla
ayrıntı için Şekil 1'e bakın.</p>
<p class="figure">
<img src="../images/rewrite_process_uri.png"
alt="RewriteRule ve RewriteCond eşleştirme akışı" /><br />
<dfn>Şekil 1:</dfn>Yeniden yazma kural kümesindeki kontrol akışı
</p>
<p>İlk olarak URL, her kuralın <em>Kalıp</em>'ıyla eşleştirilir.
Başarısız olursa <module>mod_rewrite</module> bu kuralı hemen
işlemeyi durdurur ve sonraki kuralla devam eder. <em>Kalıp</em>
eşleşirse <module>mod_rewrite</module> karşılık gelen kural
koşullarını (yapılandırmada RewriteRule'un hemen üstünde görünen
RewriteCond yönergeleri) arar. Hiçbiri yoksa, URL'yi
<em>Değiştirme</em> dizgesinden oluşturulan yeni bir değerle
değiştirir ve kural döngüsüne devam eder. Ancak koşullar
varsa, listelenme sırasına göre bunları işlemek için bir iç
döngü başlatır. Koşullar için mantık farklıdır: geçerli URL'ye
karşı bir kalıp eşleştirmeyiz. Bunun yerine, önce değişkenleri,
geri başvuruları, eşlem aramalarını <em>vb.</em> genişleterek
bir <em>SınamaDizgesi</em> oluştururuz ve ardından
<em>KoşulKalıbı</em>'nı bununla eşleştirmeye çalışırız. Kalıp
eşleşmezse, koşulların tamamı ve karşılık gelen kural başarısız
olur. Kalıp eşleşirse, daha fazla koşul kalmayana kadar bir
sonraki koşul işlenir. Tüm koşullar eşleşirse, URL'nin
<em>Değiştirme</em> ile değiştirilmesiyle işleme devam
eder.</p>
</section>
</manualpage>