.htaccess mod_rewrite - cara mengecualikan direktori dari aturan penulisan ulang

145

Saya memiliki 8 baris aturan penulisan ulang dalam file .htaccess saya. Saya perlu mengecualikan dua direktori fisik di server saya dari aturan ini, sehingga mereka dapat diakses. Untuk saat ini semua permintaan dikirim ke file index.php.

Direktori untuk dikecualikan: "admin" dan "user".

Jadi permintaan http: http://www.domain.com/admin/ tidak boleh diteruskan ke file index.php.

ErrorDocument 404 /index.php?mod=error404

Options  FollowSymLinks
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]

RewriteRule ^([^/] )/([^/] )\.html$ index.php?lang=$1&mod=$2 [L]
RewriteRule ^([^/] )/$ index.php?lang=$1&mod=home [L]
Kelvin
sumber
Saya pikir Anda lupa bilangan setelah [^/]sejak ruang kosong jika tidak diizinkan di sana (harus lolos dengan \<space>).
Gumbo
Benar Gumbo, tangkapan bagus :). itu harus ^ ([^ /] +).
Kelvin

Jawaban:

287

Coba aturan ini sebelum aturan Anda yang lain:

RewriteRule ^(admin|user)($|/) - [L]

Ini akan mengakhiri proses penulisan ulang.

Gumbo
sumber
Halo Gumbo, kode Anda berfungsi jika pengguna mengetikkan domain.com/admin/ (dengan mengakhiri garis miring) tetapi tidak tanpanya. Apakah Anda dapat mengubah kedua kasus agar berfungsi? Terima kasih
Kelvin
@ Selvin: Pergantian ($|/)harus menangani kedua kasus.
Gumbo
Bukankah lebih baik menggunakan RewriteCond di sini daripada RewriteRule?
rineez
7
@rineez RewriteCondmemang selalu membutuhkannya RewriteRule. Dan menambahkan kondisi ini sebagai diabaikan RewriteConduntuk setiap RewriteRulebisa sangat besar, satu RewriteRulesebagai jalan keluar di atas mereka yang harus diabaikan dalam kasus seperti itu lebih elegan.
Gumbo
3
@ Ergec Berarti "jangan mengubah apa pun".
Gumbo
112

Yang juga bisa Anda lakukan adalah meletakkan file .htaccess yang berisi

RewriteEngine Off

Di folder Anda ingin mengecualikan dari yang ditulis ulang (oleh aturan dalam file .htaccess yang lebih tinggi di pohon). Sederhana tetapi efektif.


sumber
18
+1 ~ .htaccess beroperasi secara hierarkis, sehingga folder lokal menimpa orang tua mereka, seperti kaskade normal di CSS atau MVC.
Atari
4
hanya ada satu hal yang harus Anda pikirkan: mengaktifkan file .htaccess (pengaturan AllowOverrideke hal lain selain Nonedi konfigurasi apache) memaksa apache untuk mencari .htaccess pada setiap permintaan. jadi jika Anda memiliki situs web / server web yang sering dikunjungi, akses filesystem / harddisk bisa berdampak besar pada kinerja ...
bohrsty
Saran sempurna untuk memvalidasi pembaruan sertifikat SSL melalui metode file. Tidak perlu memodifikasi apa pun di luar direktori sementara, atau di file vhost. Setelah validasi selesai, Anda bisa menghapus seluruh folder dan selesai. Bagus sekali.
Countzero
25

tambahkan kondisi untuk memeriksa direktori admin, sesuatu seperti:

RewriteCond %{REQUEST_URI} !^/?(admin|user)/
RewriteRule ^([^/] )/([^/] )\.html$ index.php?lang=$1&mod=$2 [L]

RewriteCond %{REQUEST_URI} !^/?(admin|user)/
RewriteRule ^([^/] )/$ index.php?lang=$1&mod=home [L]
rampok
sumber
Halo Rob, saya meletakkan baris ini tepat setelah "RewriteBase /", dan sekarang saya mendapatkan "500 Error - Internal Server Error"
Kelvin
@ Selvin Saya mengedit jawaban saya, tambahkan syarat sebelum setiap aturan yang Anda inginkan.
Rob
Yang ini satu-satunya yang benar-benar membantu saya. The jawaban yang diterima tidak tidak membantu saya.
Uwe Keim
5

Jika Anda ingin menghapus direktori tertentu dari aturan (artinya, Anda ingin menghapus direktori foo ), Anda dapat menggunakan:

RewriteEngine on

RewriteCond %{REQUEST_URI} !^/foo/$
RewriteRule !index\.php$ /index.php [L]

Aturan penulisan ulang di atas akan menulis ulang semua permintaan ke /index.php tidak termasuk permintaan untuk / foo / .

Untuk mengecualikan semua arahan yang ada, Anda harus menggunakan kondisi berikut di atas aturan Anda:

RewriteCond %{REQUEST_FILENAME} !-d

aturan berikut

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !index\.php$ /index.php [L]

menulis ulang semuanya (kecuali arahan) ke /index.php .

Amit Verma
sumber
5

Kami menggunakan aturan mod_rewrite berikut:

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/test/
RewriteCond %{REQUEST_URI} !^/my-folder/
RewriteRule (.*) http://www.newdomain.com/$1 [R=301,L]

Pengalihan ini (secara permanen dengan pengalihan 301) semua lalu lintas ke situs ke http://www.newdomain.com , kecuali permintaan ke sumber daya di direktori / test dan / folder saya. Kami mentransfer pengguna ke sumber daya persis yang mereka minta dengan menggunakan grup tangkapan (. *) Dan kemudian memasukkan $ 1 di URL baru. Pikirkan ruangnya.

Camilo Tilaguy
sumber
4
RewriteEngine On

RewriteRule ^(wordpress)($|/) - [L]
pengguna3578691
sumber