Назад | Перейти на главную страницу

Отключить mod_rewrite для подкаталога

Я запускаю CMS с использованием mod_rewrite для красивых URL-адресов, но у меня есть другой сайт, работающий в подкаталоге под CMS, который требует отключения перезаписи URL-адресов, поэтому я добавил пару строк в .htaccess файл:

Options -MultiViews
Options +ExecCGI

AddHandler php5-cgi .php
Action php-cgi /cgi-bin/php-wrapper.cgi
Action php5-cgi /cgi-bin/php-wrapper.cgi

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# Added following two lines
RewriteCond %{REQUEST_URI} ^/dir/
RewriteRule ^(.+) - [PT,L]

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d     
RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>

Это работает, ОДНАКО один из каталогов в /dir/ защищен с помощью mod_auth и все еще переписывается. Если я вытащу Require valid-user директива в .htaccess файл для этого каталога, все отлично работает.

Здесь .htaccess файл из защищенного каталога:

RewriteEngine off

AuthType Basic
AuthName "Administration"
AuthUserFile "/home/user/admin/.htpasswd"
require valid-user

Любая помощь будет оценена. Это беспокоило меня уже несколько недель! Я немного погуглил, и у других была эта проблема, но я не нашел решения.

У меня была такая же проблема, Майкл, и я наконец нашел решение

Для базовой аутентификации сервер записывает заголовок «401 Unauthorized», а затем ищет документ об ошибке на основе заранее определенного пути. В большинстве случаев документ об ошибке не существует в каталоге, который вы хотите защитить, поэтому запрос обрабатывается механизмом перезаписи, который выдает ошибку 404.

Решение этой проблемы довольно простое. Вам нужно добавить одну строку кода в ваш файл .htaccess, чтобы Apache игнорировал документ об ошибке. Когда вы закончите, код должен выглядеть примерно так:

ErrorDocument 401 "Unauthorized Access"

RewriteEngine off

AuthType Basic
AuthName "Administration"
AuthUserFile "/home/user/admin/.htpasswd"
require valid-user

Надеюсь, это сработает для вас!

В качестве альтернативы Манни:

RewriteCond %{REQUEST_URI} !^/dir/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d     
RewriteRule ^(.*)$ index.php/$1 [L]

и отбросьте два добавленных вами правила (при условии, что я правильно понял проблему) и удалите RewriteEngine из защищенного .htaccess.

Затем я бы попытался заключить операторы Rewrite в оператор <DirectoryMatch>. Вы можете просто использовать его с обратной логикой, чтобы сопоставить все каталоги, кроме того, который не следует переписывать:

<DirectoryMatch "^/(?!dir)">
    RewriteEngine on
    ...
</DirectoryMatch>