.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.