.htaccess mod_rewrite - как исключить каталог из правила перезаписи

145

У меня есть 8 строк правил перезаписи в моем файле .htaccess. Мне нужно исключить две физические директории на моем сервере из этих правил, чтобы они могли стать доступными. На данный момент все запросы отправляются в файл index.php.

Каталоги для исключения: «админ» и «пользователь».

Поэтому запросы http: http://www.domain.com/admin/ не должны передаваться в файл 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]
кельвин
источник
Я думаю, что вы забыли квантификаторы после того, [^/]как простое пространство, если не разрешено там (с ним должно быть экранировано \<space>).
Гамбо
Правда Гамбо, хороший улов :). это должно быть ^ ([^ /] +).
Кельвин

Ответы:

287

Попробуйте это правило перед вашими другими правилами:

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

Это завершит процесс переписывания.

гумбо
источник
Здравствуйте, Гамбо, ваш код работает, если пользователь типа domain.com/admin/ (с завершающим слешем), но не без него. У тебя что можно поменять для обоих случаев на работу? Спасибо
Кельвин
@ Кельвин: Чередование ($|/)должно обрабатывать оба случая.
Гамбо
Не лучше ли использовать здесь RewriteCond вместо RewriteRule?
Rineez
7
@rineez RewriteCondвсегда требует, RewriteRuleчтобы он был прикреплен к. И добавление этого условия в качестве отрицательного RewriteCondк каждому RewriteRuleможет быть довольно громоздким, единственное RewriteRuleв качестве выхода выше тех, которые следует игнорировать в таком случае, более элегантно.
Гамбо
3
@Ergec Это значит «ничего не меняй».
Гамбо
112

Что вы также можете сделать, это положить файл .htaccess, содержащий

RewriteEngine Off

В папках, которые вы хотите исключить из перезаписи (по правилам в файле .htaccess, который находится выше в дереве). Простой, но эффективный.


источник
18
+1 ~ .htaccess работает иерархически, поэтому локальные папки переопределяют своих родителей, как обычный каскад в CSS или MVC.
Atari
4
есть только одна вещь, которую вы должны иметь в виду: активация файлов .htaccess (установка AllowOverrideна что-либо другое, кроме Noneконфигурации apache) заставляет apache искать .htaccess при каждом запросе. так что если у вас часто посещаемый веб-сайт / веб-сервер, доступ к файловой системе или жесткому диску может оказать огромное влияние на производительность ...
bohrsty
Прекрасный совет для проверки продления сертификатов SSL через файловый метод. Не нужно ничего менять вне временных каталогов или в файле vhost. После завершения проверки вы можете просто удалить всю папку и все готово. Просто прекрасно.
Countzero
25

добавьте условие для проверки каталога администратора, например:

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]
обкрадывать
источник
Привет Роб, я поставил эту строку сразу после "RewriteBase /", и теперь я получаю "500 Ошибка - Внутренняя ошибка сервера"
Кельвин
@ Кельвин Я отредактировал свой ответ, добавляя условие перед каждым правилом, к которому вы хотите его применить.
Роб
Этот был единственным, кто действительно помог мне. Принял ответ ничего не поможет мне.
Уве Кейм
5

Если вы хотите удалить конкретный каталог из правила (то есть вы хотите удалить каталог foo ), вы можете использовать:

RewriteEngine on

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

Приведенное выше rewriteRule перезапишет все запросы в /index.php, за исключением запросов для / foo / .

Чтобы исключить все существующие директории, вам нужно использовать следующее условие над правилом:

RewriteCond %{REQUEST_FILENAME} !-d

следующее правило

RewriteEngine on

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

переписывает все (кроме директорий) в /index.php .

Амит Верма
источник
5

Мы использовали следующее правило mod_rewrite:

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

Это перенаправляет (постоянно с перенаправлением 301) весь трафик на сайт на http://www.newdomain.com , за исключением запросов к ресурсам в каталогах / test и / my-folder. Мы переводим пользователя в точный ресурс, который он запрашивал, используя группу захвата (. *), А затем добавляя $ 1 в новый URL. Следите за пробелами.

Камило Тилагуй
источник
4
RewriteEngine On

RewriteRule ^(wordpress)($|/) - [L]
user3578691
источник