.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. Следите за пробелами.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.