Saya telah melihat ini dalam beberapa .htaccess
contoh
RewriteBase /
Tampaknya fungsionalitasnya agak mirip dengan <base href="">
HTML.
Saya percaya mungkin secara otomatis menambahkan nilainya ke awal RewriteRule
pernyataan (mungkin yang tanpa garis miring)?
Saya tidak bisa membuatnya berfungsi dengan baik. Saya pikir itu digunakan bisa sangat berguna untuk portabilitas situs, karena saya sering memiliki server pengembangan yang berbeda dengan yang produksi. Metode saya saat ini membuat saya menghapus bagian dari RewriteRule
pernyataan saya .
Adakah yang bisa menjelaskan kepada saya secara singkat bagaimana menerapkannya?
Terima kasih
.htaccess
mod-rewrite
alex
sumber
sumber
Jawaban:
Dengan kata-kata saya sendiri, setelah membaca dokumen dan bereksperimen:
Anda dapat menggunakan
RewriteBase
untuk menyediakan basis untuk penulisan ulang Anda. Pertimbangkan iniIni adalah aturan nyata yang saya gunakan untuk memastikan bahwa URL memiliki garis miring. Ini akan dikonversi
untuk
Dengan memiliki di
RewriteBase
sana, Anda membuat jalur relatif keluar dariRewriteBase
parameter.sumber
$1
cocok dengan pola RewriteRule yang ditulis dalam kurung, tetapi jalur relatif untuk substitusi berasal dari parameter RewriteBase. Jadi, substitusi yang dihasilkan adalah/~new/$1/
.RewriteBase
arahan. Singkatnya, Anda tidak dapat memiliki lebih dari satu - saya pikir arahan terakhir yangRewriteBase
menang, dan memengaruhi keseluruhan file .htaccess.RewriteBase
untuk menyediakan dasar untuk penulisan ulang Anda" - itu cukup banyak hanya penyusunan kembali kata-kata - tapi saya tidak tahu apa "dasar" adalah dalam konteks ini, atau bagaimana arti dari contoh yang Anda berikan akan berbeda jikaRewriteBase
garis dihapus. Pergi ke manual saya pergi ...RewriteBase
hanya diterapkan pada sasaran dari kerabat aturan penulisan ulang.Menggunakan RewriteBase seperti ini ...
pada dasarnya sama dengan ...
Tetapi ketika file .htaccess ada di dalam
/folder/
maka ini juga menunjuk ke target yang sama:Meskipun dokumen selalu menunjukkan penggunaan
RewriteBase
, Apache biasanya mendeteksi dengan benar untuk jalur di bawah DocumentRoot kecuali:Anda menggunakan
Alias
arahanAnda menggunakan aturan penulisan ulang .htaccess untuk melakukan pengalihan HTTP (bukan hanya penulisan ulang diam) ke URL relatif
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. danRewriteBase
digunakan untuk menyediakan basis path relatif.Misalnya, Anda memiliki struktur folder ini:
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:/a/b/c/d
, maka URI yang ditangkap ($1
) adalaha/b/c/d
.subdir2
dan permintaannya/subdir2/e/f/g
maka URI yang ditangkap adalahe/f/g
.subsubdir
, dan permintaannya adalah/subdir2/subsubdir/x/y/z
, maka URI yang ditangkap adalahx/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:
Ini
bar.php
adalah jalur relatif, berlawanan dengan: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 kehttp://example.com/bar.php
.Tetapi aturan lainnya, dengan jalur relatif, ini didasarkan pada direktori tempat aturan itu berada. Jadi jika
ada di "root" dan Anda pergi ke
http://example.com/foo
, Anda dilayanihttp://example.com/bar.php
. Tetapi jika aturan itu ada di direktori "subdir1", dan Anda pergi kehttp://example.com/subdir1/foo
, Anda dilayanihttp://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 (menggunakanR
bendera, atau secara implisit karena Anda milikihttp://host
dalam target aturan Anda). Itu berarti aturan ini: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 karenaR
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:di "subsubdir",
http://example.com/subdir2/subsubdir/foo
akan benar-benar melayani sayahttp://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:
di mana aturan itu berada di direktori "subdir1" dan
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:
sehingga
http://example.com/subdir1/foo
akan melayanihttp://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:Dan kemudian ketika Anda perlu memindahkan file-file itu dan aturan-aturannya ke direktori lain, ubah saja basisnya:
dan hanya itu.
sumber
RewriteEngine On
. Tidak perlu pada 1and1 misalnya tetapi diperlukan di server khusus saya.AFAIK, RewriteBase hanya digunakan untuk memperbaiki kasus-kasus di mana mod_rewrite berjalan dalam
.htaccess
file yang bukan di root situs dan ia menebak jalur web yang salah (sebagai lawan jalur sistem file) untuk folder yang digunakan. Jadi jika Anda memiliki RewriteRule dalam .htaccess di folder yang dapathttp://example.com/myfolder
Anda gunakan:Jika mod_rewrite tidak berfungsi dengan benar.
Mencoba menggunakannya untuk mencapai sesuatu yang tidak biasa, daripada memperbaiki masalah ini kedengarannya seperti resep untuk menjadi sangat bingung.
sumber
RewriteBase hanya berguna dalam situasi di mana Anda hanya dapat meletakkan .htaccess di root situs Anda. Jika tidak, Anda mungkin lebih baik menempatkan file .htaccess Anda yang berbeda di berbagai direktori situs Anda dan sepenuhnya menghilangkan arahan RewriteBase.
Akhir-akhir ini, untuk situs yang kompleks, saya telah mengeluarkannya, karena itu membuat penerapan file dari pengujian untuk hidup hanya satu langkah lebih rumit.
sumber
Ketika saya mengembangkan, itu pada domain yang berbeda di dalam folder. Ketika saya mengambil situs secara langsung, folder itu tidak ada lagi. Menggunakan RewriteBase memungkinkan saya menggunakan file .htaccess yang sama di kedua lingkungan.
Ketika hidup:
Ketika berkembang:
sumber
%{REQUEST_URI}
dalamRewriteCond
direktif misalnya?Penjelasan paling jelas yang saya temukan tidak ada di dokumen apache 2.4 saat ini, tetapi dalam versi 2.0 .
Bagaimana cara kerjanya? Bagi Anda apache hacker, 2.0 doc ini berlanjut untuk memberikan "informasi terperinci tentang langkah-langkah pemrosesan internal."
Hal yang dipelajari: Meskipun kita harus terbiasa dengan "saat ini," permata dapat ditemukan dalam sejarah.
sumber
Perintah ini dapat secara eksplisit mengatur URL dasar untuk penulisan ulang Anda. Jika Anda ingin memulai di root domain Anda, Anda akan menyertakan baris berikut sebelum RewriteRule Anda:
sumber
Saya percaya kutipan ini dari dokumentasi Apache, melengkapi dengan baik jawaban sebelumnya:
sumber