RewriteBase
Sadece uygulanır hedefin a göreli yeniden yazma kuralı.
RewriteBase'i böyle kullanarak ...
RewriteBase /folder/
RewriteRule a\.html b.html
aslında aynı ...
RewriteRule a\.html /folder/b.html
Ancak .htaccess dosyası içerideyken /folder/
bu aynı hedefe işaret eder:
RewriteRule a\.html b.html
Dokümanlar her zaman a kullandığını ima etse de RewriteBase
, Apache genellikle şu durumlarda DocumentRoot altındaki yollar için doğru bir şekilde algılar:
Bu durumlarda, RewriteBase belirtmeniz gerektiğini görebilirsiniz.
Bununla birlikte, kafa karıştırıcı bir yönerge olduğu için, yeniden yazma hedeflerinizde mutlak (kök 'olarak adlandırılan') URI'leri belirtmek genellikle daha iyidir. Kurallarınızı okuyan diğer geliştiriciler bunları daha kolay kavrayacaktır.
Jon Lin'in mükemmel derinlemesine cevabından alıntı :
Bir htaccess dosyasında, mod_rewrite bir <Directory>
veya <Location>
kapsayıcısına benzer şekilde çalışır . ve RewriteBase
göreceli bir yol tabanı sağlamak için kullanılır.
Örneğin, şu klasör yapısına sahip olduğunuzu varsayalım:
DocumentRoot
|-- subdir1
`-- subdir2
`-- subsubdir
Böylece şunlara erişebilirsiniz:
http://example.com/
(kök)
http://example.com/subdir1
(Subdir1)
http://example.com/subdir2
(Subdir2)
http://example.com/subdir2/subsubdir
(Subsubdir)
A üzerinden gönderilen URI RewriteRule
, htaccess dosyasını içeren dizine göredir. Eğer varsa:
RewriteRule ^(.*)$ -
- Kök htaccess ve istek
/a/b/c/d
, sonra yakalanan URI ( $1
) olur a/b/c/d
.
- Kural içerideyse
subdir2
ve istek /subdir2/e/f/g
varsa, yakalanan URI olur e/f/g
.
- Kural
subsubdir
, ve istek /subdir2/subsubdir/x/y/z
içindeyse, yakalanan URI olur x/y/z
.
Kuralın bulunduğu dizinde bu kısım URI'den çıkarılmıştır. Yeniden yazma tabanının bu konuda bir etkisi yoktur, bu sadece dizin başına nasıl çalışır.
Ne yeniden yazma tabanı yok yapın bir URL yolu tabanını (sağlamaktır değil herhangi göreli yollar için bir dosya yolu taban) kuralın hedefi . Diyelim ki bu kurala sahipsiniz:
RewriteRule ^foo$ bar.php [L]
Bunun bar.php
aksine, göreceli bir yoldur:
RewriteRule ^foo$ /bar.php [L]
burada /bar.php
mutlak bir yoldur. Mutlak yol her zaman "kök" olacaktır (yukarıdaki dizin yapısında). Bu, kuralın "root", "subdir1", "subsubdir" vb. İçeriğinden bağımsız olarak /bar.php
yolun her zaman eşleştiği anlamına gelirhttp://example.com/bar.php
.
Ancak diğer kural, göreli yolla, kuralın bulunduğu dizine dayanır.
RewriteRule ^foo$ bar.php [L]
"kök" de ve sen git http://example.com/foo
, hizmet edersin http://example.com/bar.php
. Ancak bu kural "subdir1" dizinindeyse ve adresine giderseniz http://example.com/subdir1/foo
hizmet alırsınız http://example.com/subdir1/bar.php
. Belgelerin dediği gibi, göreceli yollar için gerekli olması gerekiyordu , ancak çoğu zaman işe yarıyor gibi görünüyor. Yeniden yönlendirme yaptığınız durumlar dışında ( R
bayrağı kullanarak veya örtük olarak http://host
kuralınızın hedefinde bulunduğunuz için). Bu şu kural anlamına gelir:
RewriteRule ^foo$ bar.php [L,R]
o "subdir2" dizininde ve sen gidersen http://example.com/subdir2/foo
mod_rewrite yerine URL yolunun bir dosya yolu olarak göreli yolu hata ve nedeniyle R
bayrak, gibi bir şey yönlendiriliyorum bitireceğiz: http://example.com/var/www/localhost/htdocs/subdir1
. Açıkçası istediğin bu değil.
Burası RewriteBase
devreye giriyor. Yönerge mod_rewrite 'a her göreli yolun başına ne ekleneceğini söyler. Eğer varsa:
RewriteBase /blah/
RewriteRule ^foo$ bar.php [L]
"subsubdir" de, http://example.com/subdir2/subsubdir/foo
aslında bana hizmet edecek http://example.com/blah/bar.php
. Tabanın sonuna "bar.php" eklenir. Pratikte, bu örnek genellikle istediğiniz gibi değildir, çünkü aynı dizin kapsayıcısında veya htaccess dosyasında birden fazla tabanınız olamaz.
Çoğu durumda, bu şekilde kullanılır:
RewriteBase /subdir1/
RewriteRule ^foo$ bar.php [L]
bu kurallar "altdir1" dizininde ve
RewriteBase /subdir2/subsubdir/
RewriteRule ^foo$ bar.php [L]
"subsubdir" dizininde olur.
Bu kısmen kurallarınızı taşınabilir hale getirmenize izin verir, böylece bunları herhangi bir dizine bırakabilirsiniz ve sadece bir grup kural yerine tabanı değiştirmeniz gerekir. Örneğin:
RewriteEngine On
RewriteRule ^foo$ /subdir1/bar.php [L]
RewriteRule ^blah1$ /subdir1/blah.php?id=1 [L]
RewriteRule ^blah2$ /subdir1/blah2.php [L]
...
Böyle koyacaksın http://example.com/subdir1/foo
hizmet edecek http://example.com/subdir1/bar.php
vs Ve "subsubdir" dizinine bu dosyaların ve tüm kuralları taşınmaya karar verdi demek. Bunun yerine her örneğini değiştirme /subdir1/
için /subdir2/subsubdir/
, sadece bir üs vardı olabilir:
RewriteEngine On
RewriteBase /subdir1/
RewriteRule ^foo$ bar.php [L]
RewriteRule ^blah1$ blah.php?id=1 [L]
RewriteRule ^blah2$ blah2.php [L]
...
Ve sonra bu dosyaları ve kuralları başka bir dizine taşımanız gerektiğinde, tabanı değiştirin:
RewriteBase /subdir2/subsubdir/
ve bu kadar.