2016-11-22 6 views
1

Darn потребовалось некоторое время, отслеживая эту причуду. У меня есть глобальные переписывания-правила, определенные в httpd.conf (или включаемый, не будет делать разницы), чтобы заставить внешний редирект для определенных шаблонов URL:Apache httpd.conf mod_rewrite отменен, если .htaccess использует mod_rewrite

<Directory "/home/*"> 
    <IfModule mod_rewrite.c> 
     RewriteEngine On 
     RewriteRule ^.*wrong\.php$ http://example.net/void.html [R,L] 
    </IfModule> 
</Directory> 

Это работает блестяще для любого виртуального хоста, который Безразлично» t имеет файл .htaccess с помощью mod_rewrite. Однако, если vhost использует какие-либо правила mod_rewrite, это не работает. Даже просто RewriteEngine on, без каких-либо правил, достаточно для отмены правил httpd.conf для vhost. Это ожидаемое поведение? На Apache/2.2.15. Я пробовал с и без R & L флаги, с оберткой и без <Directory>, и объявлен до или после виртуальных хостов, но правила просто не сработают.

Кто-то сохранит мое здравомыслие и скажет мне, как иметь (не конфликтующие) правила в httpd.conf и .htaccess работать вместе. Это должно быть возможно, и я ожидаю, что это будет поведение по умолчанию?

Edit: В соответствии с просьбой, образец .htaccess файл: =^_^=

RewriteEngine on 

Даже только что, и только. Достаточно, чтобы правила не совпадали, кажется, что раньше mod_rewrite обрывается, а новый чистый набор правил запускается, когда .htaccess вступает в игру. Также любая другая линия, связанная с mod_rewrite, вызывает то же самое. Если я придерживаюсь .htaccess, например. RewriteRule ^([X-Z])heRmaGerd[1-3]\.FOObAR$ /wherever/$1RewriteEngine on, или сам по себе как единственная строка), он, безусловно, не будет соответствовать, но достаточно отменить все, что было определено ранее.

+0

Вы уверены, что аннулирование? Или у вас есть правило, соответствующее новому запросу? Последнее кажется более вероятным, но без вашего «.htaccess» я не могу вам помочь. – Walf

+0

Ну, конечно, этого не происходит, поэтому я предполагаю, что он отменен. В '.htaccess' нет более поздних правил соответствия. Как я уже сказал, даже простого «RewriteEngine on», как единственного в файле .htaccess, достаточно, чтобы этого не произошло. Если я прокомментирую это, то правило 'httpd.conf' будет соответствовать ожидаемому. Такая же модель протестирована в нескольких доменах. Кроме того, нет никакого другого использования mod_rewrite в файлах '* .conf', поэтому для меня загадка, что вызывает это поведение. –

+0

Я могу подтвердить, что вы не сумасшедший :), это действительно так, даже на 2.4.6 –

ответ

1

Похоже, что (по крайней мере, на 2.4.6), что RewriteOptions inherit помогает, размещается либо в httpd.conf, либо .htaccess.

Согласно docs, это должно заставить только VirtualHost наследовать правила от основной конфигурации сервера, или в каждом каталог контекста, чтобы наследовать настройки родительского каталога .htaccess, но я проверил, и это, кажется, чтобы решить вашу проблему.

также:

Правила, унаследованные от родительской области применяются после правил , указанных в детской области.

+0

Блестящий, это решает. Тем не менее, я вижу, что объявление «RewriteOptions inherit» должно войти в дочерний элемент .htaccess', объявив его в родительском контексте (в 'httpd.conf' в любом случае) не имеет никакого эффекта. Кажется, это единственный способ на 2.2.x (это все, что я могу получить на CentOS). О, хорошо, что много репликации кода я могу иметь дело!До тех пор злые искатели 'wp-login.php' и' xmlrpc.php' и еще чего-то! Весь почтовый ящик ошибки httpd заставлял меня сходить с ума, трудно заметить какие-либо реальные ошибки из этого большого количества мусора. –