我正在运行一个使用 mod_rewrite 来获得漂亮 URL 的 CMS,但是我在 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
任何帮助都将不胜感激。这个问题困扰了我好几个星期!我用谷歌搜索了一下,其他人也遇到过这个问题,但我还没有找到解决办法。
答案1
我也遇到了同样的问题,迈克尔,最后找到了解决方案
对于基本身份验证,服务器会写入“401 Unauthorized”标头,然后根据预定义路径查找错误文档。大多数情况下,错误文档不会存在于您要保护的目录中,因此请求由重写引擎处理,并引发 404 错误。
这个问题的解决方案非常简单。您需要在 .htaccess 文件中添加一行代码,指示 Apache 忽略错误文档。完成后,代码应如下所示:
ErrorDocument 401 "Unauthorized Access" RewriteEngine off AuthType Basic AuthName "Administration" AuthUserFile "/home/user/admin/.htpasswd" require valid-user
希望这对你有用!
答案2
Manni 的替代方案:
RewriteCond %{REQUEST_URI} !^/dir/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
并放弃您添加的两条规则(假设我正确理解了问题),并从受保护的.htaccess中删除RewriteEngine。
答案3
接下来,我将尝试将 Rewrite 语句包含在 <DirectoryMatch> 语句中。您可以简单地将其与逆逻辑结合使用,以匹配除不应重写的目录之外的每个目录:
<DirectoryMatch "^/(?!dir)">
RewriteEngine on
...
</DirectoryMatch>