.htaccess mod_rewrite - dizini yeniden yazma kuralından nasıl hariç tutulur


146

.Htaccess dosyamda 8 satır yeniden yazma kuralım var. Erişilebilir hale gelebilmeleri için sunucumdaki iki fiziksel dizini bu kuralların dışında tutmam gerekiyor. Şimdilik tüm istekler index.php dosyasına gönderiliyor.

Hariç tutulacak dizinler: "yönetici" ve "kullanıcı".

Yani http istekleri: http://www.domain.com/admin/ index.php dosyasına aktarılmamalıdır.

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]

Oraya [^/]izin verilmiyorsa düz bir boşluktan sonra niceleyicileri unuttuğunuzu düşünüyorum (ile kaçılmalıdır \<space>).
Gumbo

Gerçek Gumbo, iyi yakaladım :). ^ ([^ /] +) olmalıdır.
Kelvin

Yanıtlar:


288

Bu kuralı diğer kurallarınızdan önce deneyin:

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

Bu, yeniden yazma sürecini sona erdirecektir.


Merhaba Gumbo, kodunuz kullanıcı türü domain.com/admin/ (bölü çizgiyle biten) yazdıysa ancak onsuz çalışıyorsa çalıştı. Her iki vakanın da işe yaraması için neler değiştirilebilir? Teşekkürler
Kelvin

@Kelvin: Alternatif ($|/)her iki durumu da ele almalı.
Gumbo

RewriteRule yerine burada RewriteCond kullanmak daha iyi değil mi?
rineez

7
@rineez RewriteCondher zaman RewriteRuleekli olduğunu gerektirir . Ve bu koşulu RewriteCondherkese olumsuzlamak olarak eklemek RewriteRuleoldukça hantal olabilir, RewriteRuleböyle bir durumda göz ardı edilmesi gerekenlerin üzerinde bir çıkış olarak tek bir çıkış daha zariftir.
Gumbo

3
@Ergec “Hiçbir şeyi değiştirme” anlamına gelir.
Gumbo

113

Ayrıca yapabileceğiniz şey, aşağıdakileri içeren bir .htaccess dosyası koymaktır.

RewriteEngine Off

Yeniden yazılmasını engellemek istediğiniz klasörlerde (ağaçta daha yukarıda olan bir .htaccess dosyasındaki kurallar tarafından). Basit ama etkili.


18
+1 ~ .htaccess hiyerarşik olarak çalışır, bu nedenle yerel klasörler, CSS veya MVC'deki normal bir basamaklama gibi üstlerini geçersiz kılar.
Atari

4
aklınızda bulundurmanız gereken tek bir şey vardır: .htaccess dosyalarını etkinleştirmek ( apache yapılandırmasından AllowOverridebaşka bir şeye ayarlamak None), apache'yi her istekte .htaccess aramaya zorlar. Yüksek bir uğrak web sitesi var eğer öyleyse / web sunucusu bu dosya sistemi / harddisk bir imense performans etkisi olabilir erişim ...
bohrsty

Dosya yöntemiyle SSL sertifikalarının yenilenmesini doğrulamak için mükemmel tavsiye. Geçici dizinlerin dışında veya vhost dosyasında herhangi bir değişiklik yapmaya gerek yoktur. Doğrulama tamamlandıktan sonra, tüm klasörü silebilirsiniz ve bitirdiniz. Harika.
Countzero

25

yönetici dizinini kontrol etmek için bir koşul ekleyin, örneğin:

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]

Merhaba Rob, bu satırı "RewriteBase /" nin hemen sonrasına koyuyorum ve şimdi "500 Hatası - Dahili Sunucu Hatası" alıyorum
Kelvin

@Kelvin Cevabımı düzenledim, uygulanmasını istediğiniz her kuralın önüne koşulu ekleyin.
Rob

Bu bana gerçekten yardımcı olan tek kişiydi. Kabul cevap vermedi değil bana yardım et.
Uwe Keim

6

Aşağıdaki mod_rewrite kuralını kullandık:

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

Bu , / test ve / klasörüm dizinlerindeki kaynaklara yapılan istekler dışında siteye gelen tüm trafiği (301 yeniden yönlendirmesiyle kalıcı olarak) http://www.newdomain.com adresine yeniden yönlendirir . Kullanıcıyı (. *) Yakalama grubunu kullanarak ve ardından yeni URL'ye $ 1 ekleyerek tam olarak istediği kaynağa aktarıyoruz. Boşluklara dikkat edin.


5

Kuraldan belirli bir dizini kaldırmak istiyorsanız (yani, foo dizinini kaldırmak istiyorsanız ), şunları kullanabilirsiniz:

RewriteEngine on

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

Yukarıdaki rewriteRule , / foo / istekleri hariç tüm istekleri /index.php'ye yeniden yazacaktır .

Mevcut tüm yönergeleri hariç tutmak için, kuralınızın üzerinde aşağıdaki koşulu kullanmanız gerekir:

RewriteCond %{REQUEST_FILENAME} !-d

aşağıdaki kural

RewriteEngine on

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

her şeyi (yönergeler hariç) /index.php'ye yeniden yazar .


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.