.htaccess mod_rewrite - jak wyłączyć katalog z reguły przepisywania

145

Mam 8 wierszy reguł przepisywania w moim pliku .htaccess. Muszę wykluczyć z tych reguł dwa fizyczne katalogi na moim serwerze, aby stały się dostępne. Na razie wszystkie żądania są wysyłane do pliku index.php.

Katalogi do wykluczenia: „admin” i „user”.

Dlatego żądania http: http://www.domain.com/admin/ nie powinny być przekazywane do pliku 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]
kelwin
źródło
Myślę, że zapomniałeś o kwantyfikatorach później, [^/]ponieważ zwykła spacja, jeśli nie jest tam dozwolona (musi zostać usunięta \<space>).
Gumbo
Prawdziwy Gumbo, dobry chwyt :). powinno być ^ ([^ /] +).
Kelvin

Odpowiedzi:

287

Wypróbuj tę regułę przed innymi zasadami:

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

To zakończy proces przepisywania.

Gumbo
źródło
Witaj Gumbo, Twój kod zadziałał, jeśli użytkownik wpisał domenę.com/admin/ (z końcowym ukośnikiem), ale nie bez niego. Co można zmienić, aby oba przypadki zadziałały? Dzięki
Kelvin
@Kelvin: alternacja ($|/)powinna obsługiwać oba przypadki.
Gumbo
Czy nie lepiej jest tutaj użyć RewriteCond zamiast RewriteRule?
rineez
7
@rineez RewriteCondzawsze wymaga znaku , do RewriteRulektórego jest dołączony. A dodanie tego warunku jako zanegowanego RewriteConddo każdego RewriteRulemoże być dość nieporęczne, pojedyncze RewriteRulejako wyjście powyżej tych, które należy zignorować w takim przypadku, jest bardziej eleganckie.
Gumbo
3
@Ergec To znaczy „niczego nie zmieniaj”.
Gumbo,
112

Możesz również umieścić plik .htaccess zawierający

RewriteEngine Off

W folderach, które chcesz wykluczyć z przepisywania (zgodnie z regułami w pliku .htaccess znajdującym się wyżej w drzewie). Proste ale efektywne.


źródło
18
+1 ~ .htaccess działa hierarchicznie, więc foldery lokalne zastępują ich rodziców, tak jak zwykła kaskada w CSS lub MVC.
Atari
4
jest tylko jedna rzecz, o której powinieneś pamiętać: aktywacja plików .htaccess (ustawienie AllowOverridena cokolwiek innego niż Nonew konfiguracji apache) zmusza apache do szukania .htaccess przy każdym żądaniu. więc jeśli masz często odwiedzaną witrynę / serwer sieciowy, dostęp do systemu plików / dysku twardego może mieć ogromny wpływ na wydajność ...
bohrsty
Doskonała rada dotycząca walidacji odnawiania certyfikatów SSL metodą pliku. Nie ma potrzeby modyfikowania niczego poza katalogami tymczasowymi lub w pliku vhost. Po zakończeniu weryfikacji możesz po prostu usunąć cały folder i gotowe. Po prostu świetnie.
Countzero
25

dodaj warunek sprawdzania katalogu administratora, na przykład:

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]
Obrabować
źródło
Witaj Rob, wstawiłem ten wiersz zaraz po „RewriteBase /”, a teraz otrzymuję komunikat „Błąd 500 - Wewnętrzny błąd serwera”
Kelvin
@Kelvin Zmieniłem odpowiedź, dodaj warunek przed każdą regułą, do której chcesz ją zastosować.
Rob
To był jedyny, który mi pomógł. Akceptowane odpowiedź czy nie może mi pomóc.
Uwe Keim
5

Jeśli chcesz usunąć określony katalog z reguły (czyli chcesz usunąć katalog foo ), możesz użyć:

RewriteEngine on

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

Reguła rewriteRule powyżej przepisuje wszystkie żądania do /index.php z wyłączeniem żądań / foo / .

Aby wykluczyć wszystkie istniejące katalogi, musisz zastosować następujący warunek nad regułą:

RewriteCond %{REQUEST_FILENAME} !-d

następująca zasada

RewriteEngine on

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

przepisuje wszystko (oprócz katalogów) do /index.php .

Amit Verma
źródło
5

Użyliśmy następującej reguły mod_rewrite:

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

To przekierowuje (trwale z przekierowaniem 301) cały ruch do witryny na http://www.newdomain.com , z wyjątkiem żądań do zasobów w katalogach / test i / my-folder. Przenosimy użytkownika do żądanego zasobu, używając grupy przechwytywania (. *), A następnie dodając 1 USD do nowego adresu URL. Uważaj na przestrzenie.

Camilo Tilaguy
źródło
4
RewriteEngine On

RewriteRule ^(wordpress)($|/) - [L]
user3578691
źródło