禁用子目录的 mod_rewrite

禁用子目录的 mod_rewrite

我正在运行一个使用 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>

相关内容