如果此子目录包含另一个 .htaccess

RewriteRule unwantedly redirects request to index.php instead of serving subdirectory as-is, if this subdirectory contains another .htaccess

我们项目的基目录中有一个 .htaccess 文件,其中包含允许 SEO 友好 URI 的 RewriteRule。现有文件或目录应按原样提供。该项目可以通过其域直接访问,即。 e. 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 身份验证来保护管理区域,因为它没有内置保护。因此,我们在 /admin 子目录中放置了另一个 .htaccess 文件,该文件仅包含如下 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. 如果我只禁用 /admin 目录中的 .htaccess 文件,主项目的 SEO 友好 URI 仍然有效,我可以访问管理区域,但它不受密码保护
  2. 如果我扭转局面,只禁用基本目录中的 .htaccess 文件,管理区域可以访问并受密码保护,但主项目的 SEO 友好 URI 不再起作用

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

我怎样才能同时工作?

我们之前曾因为这个问题联系过我们的基础设施提供商,但他们只是告诉我们“试试这个那个”。鼓捣了一段时间还是没能解决问题,我们又联系了我们的基础设施提供商。这一次,他们实际上自己检查了他们的系统,并意识到他们在目录树的某个地方(我们无权访问的地方)有一个旧的 .htaccess 文件,这显然是由 Apache 应用的......他们删除了它,现在它一切都很好...

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