Saya sedang menulis kerangka kerja MVC-ish berbasis PHP sederhana. Saya ingin framework ini dapat diinstal di direktori mana pun.
Skrip PHP saya mengambil uri permintaan dan memecahnya menjadi beberapa segmen. Itu membuat segmen 1 sebagai pengontrol dan segmen 2 menjadi aksi. Ini akan baik-baik saja ketika saya melakukan ini:
http://www.example.com/mvc/module/test/
Ini akan menuju ke pengontrol modul dan metode tertentu. Sekarang saya memiliki pengontrol default, pengontrol rumah, yang ada di folder rumah.
Sekarang ketika saya mengakses folder ini secara langsung http://www.example.com/mvc/home/ Ini akan menampilkan 403 terlarang, karena folder ini memang ada, sebagai gantinya juga harus kembali ke http://www.example.com /mvc/index.php
Jika saya akan menginstal kerangka kerja di folder yang berbeda, katakanlah kerangka folder itu harus dialihkan kembali ke http://www.example.com/framework/index.php
Saya ingin mengarahkan setiap folder dan file php kembali ke index.php, membiarkan yang lainnya seperti itu.
Masalah pertama saya yang saya temui adalah tidak pernah dialihkan ke folder yang benar, selalu ke folder root domain.
Inilah yang saya coba:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]
index.php
atau Anda ingin mengarahkan ulang setiap permintaan yang dibuat ke folder tertentu ituindex.php
?Jawaban:
Aturan penulisan ulang Anda terlihat hampir oke.
Pertama-tama pastikan bahwa
.htaccess
file Anda ada di root dokumen Anda (tempat yang sama denganindex.php
) atau itu hanya akan mempengaruhi sub-folder di dalamnya (dan sub-folder di dalamnya - secara rekursif).Selanjutnya buat sedikit perubahan pada aturan Anda sehingga terlihat seperti ini:
Pada saat Anda hanya cocok pada
.
yang satu contoh dari karakter apapun, Anda memerlukan setidaknya.*
untuk mencocokkan sejumlah contoh karakter apapun.The
$_GET['path']
variabel akan berisi struktur direktori palsu, sehingga/mvc/module/test
misalnya, yang kemudian dapat digunakan dalam index.php untuk menentukan Pengendali dan tindakan Anda ingin melakukan.Jika Anda ingin seluruh shebang dipasang di sub-direktori, seperti
/mvc/
atau/framework/
cara paling tidak rumit untuk melakukannya adalah dengan mengubah sedikit aturan penulisan ulang untuk memperhitungkannya.Dan pastikan bahwa Anda
index.php
ada di folder itu sementara.htaccess
file ada di root dokumen.Alternatif untuk
$_GET['path']
(diperbarui Feb '18 dan Jan '19)Sebenarnya tidak perlu (atau bahkan umum sekarang) untuk menyetel jalur sebagai
$_GET
variabel, banyak kerangka kerja akan mengandalkan$_SERVER['REQUEST_URI']
untuk mengambil informasi yang sama - biasanya untuk menentukan Pengontrol mana yang akan digunakan - tetapi prinsipnya persis sama.Ini
RewriteRule
sedikit menyederhanakan karena Anda tidak perlu membuat parameter jalur (yang berarti orisinal OP sekarangRewriteRule
akan berfungsi):Namun , aturan tentang menginstal di sub-direktori masih berlaku, mis
Bendera:
NC
= Tidak Ada Kasus (tidak peka huruf besar kecil, tidak terlalu diperlukan karena tidak ada karakter dalam pola)L
= Terakhir (ini akan berhenti menulis ulang setelah Penulisan Ulang ini jadi pastikan itu adalah hal terakhir dalam daftar penulisan ulang Anda)QSA
= Query String Append, kalau-kalau Anda memiliki sesuatu seperti?like=penguins
di akhir yang ingin Anda simpan dan teruskan ke index.php.sumber
Options +Indexes
dan index.php disertakan di dalamnyaDirectoryIndex
Anda dapat meninggalkan index.php sama sekali dan hanya menggunakan/?path=$1
Ini berlaku ketika menulis ulang melalui .htaccess daripada menggunakan<Directory>
direktif jenis httpd-vhosts.conf .$_GET['path']
jika mereka menambahkanpath=whatever
ke URL.$_GET
sehingga akan diperlukan(.*)
... itu lucu tetapi RewriteRule yang digunakan OP 6 tahun yang lalu tidak berfungsi untuk mereka saat itu - tetapi dengan cara arsitektur MVC memiliki berevolusi dengan PHP (seperti yang saya masukkan di Update Feb 18 bit) sekarang akan ... menebak mereka lebih cepat dari waktu mereka :) Masih membutuhkan jalur yang benar ke/mvc/
direktori tentunya.Untuk mengarahkan semua yang tidak ada
index.php
, Anda juga bisa menggunakanFallBackResource
direktifIni berfungsi sama seperti
ErrorDocument
, ketika Anda meminta jalur atau file yang tidak ada di server, perintah diam-diam menguraikan permintaan untukindex.php
.Jika Anda ingin mengalihkan semuanya (
including existant files or folders
) keindex.php
, Anda dapat menggunakan sesuatu seperti berikut:Perhatikan bahwa pola
^((?!index\.php).+)$
cocok dengan uri mana pun kecualiindex.php
kami telah mengecualikan jalur tujuan untuk mencegah kesalahan perulangan tak terbatas.sumber
DirectoryIndex index.php
*
sebagai ganti+
pola jika Anda juga ingin mengalihkan jalur root itu sendiri.Anda dapat menggunakan sesuatu seperti ini:
Ini akan mengarahkan setiap kueri ke index.php direktori root. Perhatikan bahwa ini juga akan mengarahkan kueri untuk file yang ada, seperti gambar, file javascript atau lembar gaya.
sumber
Ada satu "trik" untuk masalah ini yang cocok untuk semua skenario, solusi yang sangat jelas sehingga Anda harus mencobanya untuk meyakini bahwa ini benar-benar berfungsi ... :)
Ini dia...
Pada dasarnya, Anda meminta MOD_REWRITE untuk meneruskan ke
index.php
permintaan URI selalu ketika file ada DAN selalu ketika file yang diminta tidak ada !Saat menyelidiki kode sumber MOD-REWRITE untuk memahami cara kerjanya, saya menyadari bahwa semua pemeriksaannya selalu terjadi setelah verifikasi apakah file yang direferensikan ada atau tidak. Baru setelah
RegEx
itu diproses. Meskipun URI Anda mengarah ke folder, Apache akan memberlakukan pemeriksaan untuk file indeks tercantum dalam file konfigurasinya.Berdasarkan penemuan sederhana itu, ternyata validasi file sederhana akan cukup untuk semua kemungkinan panggilan , sejauh kita mengetuk dua kali pemeriksaan keberadaan file dan mengarahkan kedua hasil ke titik akhir yang sama, mencakup 100% kemungkinan.
PENTING: Perhatikan bahwa tidak ada " / " di
index.php
. Secara default, MOD_REWRITE akan menggunakan folder yang ditetapkan sebagai "folder dasar" untuk penerusan. Keindahannya adalah bahwa ini tidak perlu menjadi "folder root" dari situs, memungkinkan solusi ini bekerja untuklocalhost/
dan / atau subfolder yang Anda terapkan.Pada akhirnya, beberapa solusi lain yang saya uji sebelumnya (yang tampaknya berfungsi dengan baik) mematahkan kemampuan PHP untuk "memerlukan" file melalui jalur relatifnya, yang sangat mengecewakan. Hati-hati.
Beberapa orang mungkin mengatakan ini adalah solusi yang tidak elegan. Mungkin sebenarnya, tetapi sejauh pengujian, dalam beberapa skenario, beberapa server, beberapa versi Apache yang berbeda, dll., Solusi ini bekerja 100% pada semua kasus!
sumber
FallbackResource index.php
garis berfungsi pada Mac (OS X 10.11) tetapi tidak di bawah Centos 7.5. Namun: iniRewriteRule
juga menulis ulang lokasi file CSS misalnya. Karena saya hanya perlu mengalihkan file PHP, saya mengubah aturan menjadiRewriteRule ^(.*)php$ index.php [L,QSA]
. YMMV.RewriteRule ^(.*)\.php$ index.php [L,NE,QSA]
(yang tidak memerlukan kondisi untuk berfungsi). Sekarang, bagaimanapun, saya menggunakan aturan yang lebih murah:,RewriteRule ^.+$ index.php [L,NE,QSA]
yang dapat digabungkan dengan kondisiRewriteCond %{REQUEST_FILENAME} !-f
danRewriteCond %{REQUEST_FILENAME} !-d
, atau bahkan denganRewriteCond $1 !^(index\.php|assets|robots\.txt|favicon\.ico)
benar-benar spesifik.Jawaban konyol tetapi jika Anda tidak tahu mengapa tidak mengalihkan periksa apakah yang berikut ini diaktifkan untuk folder web ..
AllowOverride All
Ini akan memungkinkan Anda untuk menjalankan htaccess yang harus dijalankan! (ada alternatif tetapi tidak aktif akan menyebabkan masalah https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride )
sumber
Setelah melakukan jangan lupa ganti anchor tag nya, home
Contoh:
sumber
berjaga-jaga jika Anda masih bertanya-tanya bagaimana cara mengarahkan semua permintaan baik jika direktori ada (untuk folder dan file kerangka inti) ke penangan indeks kerangka kerja, setelah beberapa upaya kesalahan / sukses baru saja saya perhatikan saya hanya perlu mengubah RewriteCond di .htaccess mengajukan
kondisi di atas menyatakan "file tidak ditemukan" dan "direktori tidak ditemukan", ok, bagaimana jika hanya menghapus baris "tidak ditemukan" (! -d), dan diakhiri dengan sesuatu seperti di bawah ini:
Ini bekerja untuk saya seperti pesona
sumber