RewriteBase
hanya diterapkan pada sasaran dari kerabat aturan penulisan ulang.
Menggunakan RewriteBase seperti ini ...
RewriteBase /folder/
RewriteRule a\.html b.html
pada dasarnya sama dengan ...
RewriteRule a\.html /folder/b.html
Tetapi ketika file .htaccess ada di dalam /folder/
maka ini juga menunjuk ke target yang sama:
RewriteRule a\.html b.html
Meskipun dokumen selalu menunjukkan penggunaan RewriteBase
, Apache biasanya mendeteksi dengan benar untuk jalur di bawah DocumentRoot kecuali:
Dalam kasus ini, Anda mungkin menemukan bahwa Anda perlu menentukan RewriteBase.
Namun, karena ini adalah arahan yang membingungkan, biasanya lebih baik untuk menentukan URI absolut (alias 'relatif') dalam target penulisan ulang Anda. Pengembang lain yang membaca aturan Anda akan memahami ini dengan lebih mudah.
Mengutip dari jawaban mendalam yang sangat baik dari Jon Lin di sini :
Dalam file htaccess, mod_rewrite bekerja mirip dengan <Directory>
atau <Location>
wadah. dan RewriteBase
digunakan untuk menyediakan basis path relatif.
Misalnya, Anda memiliki struktur folder ini:
DocumentRoot
|-- subdir1
`-- subdir2
`-- subsubdir
Jadi Anda dapat mengakses:
http://example.com/
(akar)
http://example.com/subdir1
(subdir1)
http://example.com/subdir2
(subdir2)
http://example.com/subdir2/subsubdir
(subsubdir)
URI yang dikirimkan melalui a RewriteRule
adalah relatif ke direktori yang berisi file htaccess. Jadi, jika Anda memiliki:
RewriteRule ^(.*)$ -
- Di root htaccess, dan permintaannya adalah
/a/b/c/d
, maka URI yang ditangkap ( $1
) adalah a/b/c/d
.
- Jika aturannya ada
subdir2
dan permintaannya /subdir2/e/f/g
maka URI yang ditangkap adalah e/f/g
.
- Jika aturannya ada di
subsubdir
, dan permintaannya adalah /subdir2/subsubdir/x/y/z
, maka URI yang ditangkap adalah x/y/z
.
Direktori tempat aturan berada memiliki bagian yang dilepaskan dari URI. Basis penulisan ulang tidak memengaruhi hal ini, ini hanyalah cara kerja per-direktori.
Apa dasar menulis ulang tidak lakukan, adalah memberikan dasar URL-jalan ( bukan basis berkas-jalan) untuk setiap path relatif dalam sasaran aturan ini . Jadi katakan Anda memiliki aturan ini:
RewriteRule ^foo$ bar.php [L]
Ini bar.php
adalah jalur relatif, berlawanan dengan:
RewriteRule ^foo$ /bar.php [L]
di mana itu /bar.php
adalah jalur absolut. Path absolut akan selalu menjadi "root" (dalam struktur direktori di atas). Itu berarti bahwa terlepas dari apakah aturannya ada di "root", "subdir1", "subsubdir", dll. /bar.php
Path selalu dipetakan ke http://example.com/bar.php
.
Tetapi aturan lainnya, dengan jalur relatif, ini didasarkan pada direktori tempat aturan itu berada. Jadi jika
RewriteRule ^foo$ bar.php [L]
ada di "root" dan Anda pergi ke http://example.com/foo
, Anda dilayani http://example.com/bar.php
. Tetapi jika aturan itu ada di direktori "subdir1", dan Anda pergi ke http://example.com/subdir1/foo
, Anda dilayani http://example.com/subdir1/bar.php
. dll. Ini kadang-kadang berfungsi dan kadang tidak, seperti yang dikatakan dalam dokumentasi, itu diperlukan untuk jalur relatif, tetapi sebagian besar waktu tampaknya berfungsi. Kecuali ketika Anda mengarahkan ulang (menggunakan R
bendera, atau secara implisit karena Anda miliki http://host
dalam target aturan Anda). Itu berarti aturan ini:
RewriteRule ^foo$ bar.php [L,R]
jika itu dalam "subdir2" direktori, dan Anda pergi ke http://example.com/subdir2/foo
, mod_rewrite akan kesalahan path relatif sebagai file-jalan bukannya URL-jalan dan karena R
bendera, Anda akan berakhir mendapatkan diarahkan ke sesuatu seperti: http://example.com/var/www/localhost/htdocs/subdir1
. Yang jelas bukan yang Anda inginkan.
Di sinilah RewriteBase
masuk. Arahan memberitahu mod_rewrite apa yang harus ditambahkan ke awal setiap jalur relatif. Jadi jika saya punya:
RewriteBase /blah/
RewriteRule ^foo$ bar.php [L]
di "subsubdir", http://example.com/subdir2/subsubdir/foo
akan benar-benar melayani saya http://example.com/blah/bar.php
. "Bar.php" ditambahkan ke ujung pangkalan. Dalam praktiknya, contoh ini biasanya bukan yang Anda inginkan, karena Anda tidak dapat memiliki banyak pangkalan di wadah direktori atau file htaccess yang sama.
Dalam kebanyakan kasus, digunakan seperti ini:
RewriteBase /subdir1/
RewriteRule ^foo$ bar.php [L]
di mana aturan itu berada di direktori "subdir1" dan
RewriteBase /subdir2/subsubdir/
RewriteRule ^foo$ bar.php [L]
akan berada di direktori "subsubdir".
Ini sebagian memungkinkan Anda untuk membuat aturan Anda portabel, sehingga Anda dapat menjatuhkannya di direktori mana pun dan hanya perlu mengubah basis alih-alih sekelompok aturan. Misalnya jika Anda memiliki:
RewriteEngine On
RewriteRule ^foo$ /subdir1/bar.php [L]
RewriteRule ^blah1$ /subdir1/blah.php?id=1 [L]
RewriteRule ^blah2$ /subdir1/blah2.php [L]
...
sehingga http://example.com/subdir1/foo
akan melayani http://example.com/subdir1/bar.php
dll. Dan katakanlah Anda memutuskan untuk memindahkan semua file dan aturan itu ke direktori "subsubdir". Alih-alih mengubah setiap instance /subdir1/
menjadi /subdir2/subsubdir/
, Anda bisa saja memiliki basis:
RewriteEngine On
RewriteBase /subdir1/
RewriteRule ^foo$ bar.php [L]
RewriteRule ^blah1$ blah.php?id=1 [L]
RewriteRule ^blah2$ blah2.php [L]
...
Dan kemudian ketika Anda perlu memindahkan file-file itu dan aturan-aturannya ke direktori lain, ubah saja basisnya:
RewriteBase /subdir2/subsubdir/
dan hanya itu.