Я запускаю 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>