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


145

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

Каталоги для виключення: "admin" та "user".

Тому 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> ).
Gumbo

Справжній Ґумбо, хороший улов :). це має бути ^ ([^ /] +).
Кельвін

Відповіді:


287

Спробуйте це правило перед іншими правилами:

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

Це закінчить процес переписування.


Здрастуйте Gumbo, ваш код працював, якщо користувач ввів domain.com/admin/ (із закінченням косою рисою), але не без нього. Ви що, що можна змінити для роботи обох випадків? Спасибі
Келвін

@Kelvin: Чергування ($|/)має вирішувати обидва випадки.
Gumbo

Чи не краще тут використовувати RewriteCond замість RewriteRule?
rineez

7
@rineez RewriteCondзавжди вимагає того, до RewriteRuleякого він приєднаний. І додавання цієї умови як запереченої RewriteCondдо кожного RewriteRuleможе бути досить об’ємною, одиничний RewriteRuleяк вихід вище тих, які слід ігнорувати в такому випадку, є більш елегантним.
Gumbo

3
@Ergec Це означає "нічого не змінювати".
Gumbo

112

Можна також поставити файл .htaccess, що містить

RewriteEngine Off

У папках, які ви хочете виключити з переписування (за правилами у .htaccess-файлі, який вище в дереві). Простий, але ефективний.


18
+1 ~ .htaccess діє ієрархічно, тому локальні папки перекривають своїх батьків, як і звичайний каскад у CSS або MVC.
Atari

4
Ви маєте пам’ятати лише про одне: активація файлів .htaccess (встановлення AllowOverrideнічого іншого, ніж Noneу конфігурації apache) змушує apache шукати .htaccess за кожним запитом. тож якщо у вас веб-сайт / веб-сервер із високою відвідуваністю, то файлова система / доступ до жорсткого диска може мати негативний вплив на продуктивність ...
bohrsty

Ідеальна порада щодо підтвердження поновлення сертифікатів SSL за допомогою файлового методу. Не потрібно нічого змінювати за межами тимчасових каталогів або у файлі vhost. Після завершення перевірки ви можете просто видалити всю папку і все закінчено. Просто здорово.
Графзеро

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 помилок - внутрішня помилка сервера"
Келвін

@Kelvin Я відредагував свою відповідь, додав умову перед кожним правилом, до якого потрібно застосувати.
Роб

Цей був єдиний, хто насправді допоміг мені. Прийняв відповідь нічого НЕ допоможе мені.
Уве

5

Якщо ви хочете видалити певний каталог із правила (тобто ви хочете видалити foo 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.