RewriteBase .htaccess içinde nasıl çalışır


227

Bunu birkaç .htaccessörnekte gördüm

RewriteBase /

<base href="">HTML işlevine işlevselliği biraz benzer görünüyor .

Ben otomatik olarak RewriteRuleifadelerin başlangıcına (muhtemelen önde eğik çizgi olmadan olanlar) değerini başlatabilir inanıyorum ?

Düzgün çalışamadım. Ben sık sık bir üretim olandan farklı bir geliştirme sunucusu var gibi, kullanımı site taşınabilirliği için çok kullanışlı gelebilir düşünüyorum. Şu anki yöntemim bölümlerimi RewriteRuleifadelerimden siler

Biri bana kısaca nasıl uygulanacağını açıklayabilir mi?

Teşekkürler



RewriteBase yalnızca dizinde veya .htaccess bağlamında çalışır ... sağlanan @SalmanPK bağlantısı için bağlama bakın.
Eddie B

1
İyi bir açıklama için bu cevaba bakınız. stackoverflow.com/a/2137593/292060
goodeye

1
Bu daha ayrıntılı bir cevaptır: stackoverflow.com/a/21348047/632951
Pacerier

Bu 1 satırlık bir cevaptır: stackoverflow.com/a/46541685/632951
Pacerier

Yanıtlar:


102

Kendi sözlerimle, belgeleri okuduktan ve denedikten sonra:

Yeniden yazma RewriteBaseişlemleriniz için bir taban sağlamak için kullanabilirsiniz . Bunu düşün

# invoke rewrite engine
    RewriteEngine On
    RewriteBase /~new/

# add trailing slash if missing
    rewriteRule ^(([a-z0-9\-]+/)*[a-z0-9\-]+)$ $1/ [NC,R=301,L]

Bu, URL'lerin sonunda eğik çizgi olmasını sağlamak için kullandığım gerçek bir kuraldır. Bu dönüşecek

http://www.example.com/~new/page

için

http://www.example.com/~new/page/

Sahip olarak RewriteBaseorada, sen göreli yolu kapalı dönüştürecek RewriteBaseparametreyi.


10
“RewriteBase parametresinden çıkın” - rewriteRule parametresini mi kastettiniz? :)
Kissaki

1
Bir RewriteBase htaccess tüm kurallar için ayarlayın gelmez .. htaccess üzerinde bazı ayrıntıları açıklığa kavuşturmak istiyorum aşağıdaki ne onun beyanı? sıfırlamanın bir yolu var mı, sıfırlanabilir mi?
Damon

3
@Kissaki: Hayır, $1parantez içindeki RewriteRule modeliyle eşleşir, ancak değiştirmenin göreli yolu RewriteBase parametresinden çıkar. Yani, ortaya çıkan ikame /~new/$1/.
MrWhite

3
@Damon: Birden fazla yönergeyle ilgili bu soruya bakın RewriteBase. Kısacası, birden fazla olamaz - Bence son RewriteBase yönerge kazanır ve tüm .htaccess dosyasını etkiler.
MrWhite

24
1; bu cevap başkalarına yardımcı olmuş gibi gözüküyor, ama bana karşı tamamen opak. "Yeniden RewriteBaseyazma işlemleriniz için bir üs sağlamak için kullanabilirsiniz" ifadesini tahmin edebilirdim - bu sadece kelimelerin yeniden düzenlenmesi - ama bu bağlamda bir "üs" nün ne olduğu , ne anlama geldiği hakkında hiçbir fikrim yok RewriteBasesatırın kaldırılması durumunda verdiğiniz örnek farklı olabilir . Manuel gidiyorum ...
Mark Amery

89

RewriteBaseSadece 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:

  • AliasDirektifleri kullanıyorsunuz

  • Göreli URL'lere HTTP yeniden yönlendirmeleri (yalnızca sessiz yeniden yazma yerine) gerçekleştirmek için .htaccess yeniden yazma kurallarını kullanıyorsunuz

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 RewriteBasegö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 subdir2ve istek /subdir2/e/f/gvarsa, yakalanan URI olur e/f/g.
  • Kural subsubdir, ve istek /subdir2/subsubdir/x/y/ziç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.phpaksine, göreceli bir yoldur:

RewriteRule ^foo$ /bar.php [L]

burada /bar.phpmutlak 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.phpyolun 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/foohizmet 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 ( Rbayrağı kullanarak veya örtük olarak http://hostkuralı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/foomod_rewrite yerine URL yolunun bir dosya yolu olarak göreli yolu hata ve nedeniyle Rbayrak, gibi bir şey yönlendiriliyorum bitireceğiz: http://example.com/var/www/localhost/htdocs/subdir1. Açıkçası istediğin bu değil.

Burası RewriteBasedevreye 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/fooaslı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/foohizmet edecek http://example.com/subdir1/bar.phpvs 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.


Benim için özledim RewriteEngine On. Örneğin 1 ve 1'e gerek yok, ancak özel sunucumda gerekli.
Portekoi

41

AFAIK, RewriteBase yalnızca mod_rewrite'ın .htaccessbir sitenin kök dizininde olmayan bir dosyada çalıştığı durumları düzeltmek için kullanılır ve çalıştığı klasör için yanlış web yolunu (dosya sistemi yolunun aksine) tahmin eder. RewriteRule ile eşlenen bir klasördeki bir .htaccess dosyasında http://example.com/myfolderkullanabilirsiniz:

RewriteBase myfolder

Mod_rewrite düzgün çalışmıyorsa.

Bu sorunu düzeltmek yerine alışılmadık bir şey elde etmek için kullanmaya çalışmak çok karışık bir tarif gibi geliyor.


2
Sondaki eğik çizgi ile bitmesi gerekiyor mu?
Pacerier

@self, No. Test edildi ve burada alt açıklama yapıldı: stackoverflow.com/a/11443194/632951
Pacerier

23

RewriteBase yalnızca sitenizin kök dizinine yalnızca bir .htaccess koyabileceğiniz durumlarda kullanışlıdır. Aksi takdirde, farklı .htaccess dosyalarınızı sitenizin farklı dizinlerine yerleştirmek ve RewriteBase yönergesini tamamen atlamak daha iyi olabilir.

Son zamanlarda, karmaşık siteler için onları çıkarıyorum, çünkü dosyaları test etmekten sadece bir adım daha karmaşık hale getirmek için dağıtmayı yapıyor.


22
Bu iyi bir tavsiye olabilir, ancak bu sorunun cevabı değildir. Dolayısıyla soruya bir yorum olmalı, (çok sayıda) oy almamış ve kesinlikle “cevap” olarak kabul edilmemiş olmalıdır.
Kissaki

3
"farklı .htaccess dosyalarınızı farklı dizinlere yerleştirmek daha iyi" - Bunun iyi bir tavsiye olduğundan emin değilim? Sitenizin her yerinde noktalı .htaccess dosyaları olması, hata ayıklama / bakım işlemlerini kabus haline getirebilir. Sitenizin kök dizininde bir .htaccess dosyası olmasını tercih ederdim .
MrWhite

1
@ w3d Ayrıca bir zamanlama sorunu da vardır: bir alt dizine her erişildiğinde, birden çok .htaccess dosyası ayrılır (kökten geçerli alt dizine). Çok sayıda dosyaya sahip olmak, çok sayıda kural içeriyor olsa bile, kökteki tek bir dosyanın aksine, isteğe genel yanıtın hızını düşürebilir ..
Erenor Paz

19

Geliştirdiğimde, klasör içindeki farklı bir etki alanında. Bir siteyi yayına aldığımda, bu klasör artık mevcut değil. RewriteBase kullanmak her iki ortamda aynı .htaccess dosyasını kullanmama izin veriyor.

Yayında:

RewriteBase /
# RewriteBase /dev_folder/

Gelişirken:

# RewriteBase /
RewriteBase /dev_folder/

4
Eminim bu her zaman işe yaramaz. Örneğin %{REQUEST_URI}bir RewriteConddirektifte kullandıysanız ne olur ?
MrWhite

1
@ user1669830, Yalnızca bir yeniden yazıcınız varsa, tabanı yeniden
yazıya ekleyebilirdiniz

18

Bulduğum en açık açıklama mevcut 2.4 apache dokümanı değil, sürüm 2.0'da oldu .

#  /abc/def/.htaccess -- per-dir config file for directory /abc/def
#  Remember: /abc/def is the physical path of /xyz, i.e., the server
#            has a 'Alias /xyz /abc/def' directive e.g.

RewriteEngine On

#  let the server know that we were reached via /xyz and not
#  via the physical path prefix /abc/def
RewriteBase   /xyz

O nasıl çalışır? Apache korsanları için, bu 2.0 dokümanı "dahili işlem adımları hakkında ayrıntılı bilgi" vermeye devam ediyor.

Alınan ders: "Akım" a aşina olmamız gerekmesine rağmen, mücevherler yıllıklarda bulunabilir.


3

Bu komut, yeniden yazma işlemleriniz için temel URL'yi açıkça ayarlayabilir. Alan adınızın kök dizininden başlamak istiyorsanız, RewriteRule öğenizin önüne aşağıdaki satırı eklersiniz:

RewriteBase /

2

Apache belgelerinden alınan bu alıntı, önceki cevapları iyi tamamlıyor:

Bu yönerge, aşağıdaki koşullardan biri doğru olmadığı sürece dizin başına (htaccess) bağlamında bir ikamede göreli bir yol kullandığınızda gereklidir:

  • Orijinal istek ve değiştirme, DocumentRoot'un altındadır (Takma ad gibi başka yollarla erişilemez).

  • RewriteRule içeren dizinin göreli ikameyle eklenmiş dosya sistemi yolu, sunucudaki URL yolu olarak da geçerlidir (bu nadirdir).

Daha önce belirtildiği gibi, diğer bağlamlarda, sadece kuralınızı kısaltmak yararlıdır. Ayrıca, daha önce de belirtildiği gibi, htaccess dosyasını alt dizine yerleştirerek aynı şeyi başarabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.