首页 > 解决方案 > 如果此子目录包含另一个 .htaccess,RewriteRule 会不必要地将请求重定向到 index.php,而不是按原样提供子目录

问题描述

我们.htaccess在项目的基本目录中有一个文件,其中包含一个 RewriteRule 以允许 SEO 友好的 URI。现有文件或目录应按原样提供。该项目可以通过其域直接访问,即www.example.com. 这个.htaccess文件看起来像这样

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ index.php [L]

该项目的管理区域位于一个名为 的子文件夹中/admin。这个管理区域是一个非常基本的老式 PHP 应用程序,它不使用 RewriteRules,它应该像任何普通的子目录一样可以访问。从上面使用我的示例域将是www.example.com/admin.

此外,我们需要使用 HTTP 身份验证来保护管理区域,因为它没有内置保护。因此,我们在子目录中放置了另一个.htaccess文件,该文件/admin仅包含 auth 配置,如下所示

AuthType Basic
AuthName "Administration area"
AuthUserFile /path/to/.htusers
AuthGroupFile /path/to/.htgroups
Require group superuser

Options -Indexes

这是它变得疯狂的地方,至少对我来说,但这可能只是因为我对 mod_rewrite 模块缺乏深入的了解。如果两个.htaccess文件都处于活动状态,则无法访问管理区域,因为显然请求被重写到index.php基目录的文件中。如果我通过重命名这两个.htaccess文件中的任何一个来禁用它们,它就会起作用:

  1. 如果我只禁用.htaccess目录内的文件/admin,主项目的 SEO 友好 URI 仍然有效,我可以访问管理区域,但它不受密码保护
  2. 如果我扭转局面并且只禁用.htaccess基本目录中的文件,则可以访问管理区域并且受密码保护,但是主项目的 SEO 友好 URI 不再起作用

我试图通过在其他两个条件之前/admin添加条件来手动从 RewriteRule 中排除目录RewriteCond %{REQUEST_URI} !^/admin,即使由于 !-d RewriteCond 这应该是多余的,但这并没有改变行为。

我怎样才能让事情同时工作?

标签: apache.htaccessmod-rewrite

解决方案


由于这个问题,我们之前曾联系过我们的基础设施提供商,但他们只是告诉我们“试试这个和那个”。在修补了一段时间但仍然无法解决问题后,我们再次联系了我们的基础设施提供商。这一次,他们实际上自己检查了他们的系统,并意识到他们在目录树的某处(我们无权访问)中有一个旧的 .htaccess 文件,这显然是由 Apache 应用的......他们删除了它,现在它一切都好...

经验教训:如果事情看起来很奇怪,请惹恼您的提供者,直到他们最终关心为止。


推荐阅读