apache - 如果此子目录包含另一个 .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
文件中的任何一个来禁用它们,它就会起作用:
- 如果我只禁用
.htaccess
目录内的文件/admin
,主项目的 SEO 友好 URI 仍然有效,我可以访问管理区域,但它不受密码保护 - 如果我扭转局面并且只禁用
.htaccess
基本目录中的文件,则可以访问管理区域并且受密码保护,但是主项目的 SEO 友好 URI 不再起作用
我试图通过在其他两个条件之前/admin
添加条件来手动从 RewriteRule 中排除目录RewriteCond %{REQUEST_URI} !^/admin
,即使由于 !-d RewriteCond 这应该是多余的,但这并没有改变行为。
我怎样才能让事情同时工作?
解决方案
由于这个问题,我们之前曾联系过我们的基础设施提供商,但他们只是告诉我们“试试这个和那个”。在修补了一段时间但仍然无法解决问题后,我们再次联系了我们的基础设施提供商。这一次,他们实际上自己检查了他们的系统,并意识到他们在目录树的某处(我们无权访问)中有一个旧的 .htaccess 文件,这显然是由 Apache 应用的......他们删除了它,现在它一切都好...
经验教训:如果事情看起来很奇怪,请惹恼您的提供者,直到他们最终关心为止。
推荐阅读
- php - 如何在laravel中搜索具有数组属性的对象数组
- vb.net - 如何在 VB.net 中动态编译代码?动态检索成员变量名
- python - 使用黄砖库的预测误差图问题(回归)
- java - 休眠。如何将条目添加到具有来自 Hibernate 中 2 个不同表的 2 个外键的表中?
- php - 尝试将 php-cgi.exe 文件链接到 PHP 管理器扩展时出现 IIS 错误:“由于对象的当前状态,操作无效”
- windows - ElementsProject 无法编译?
- django - 简化 Django 查询注解
- django - 为什么表中的数据没有在 django 中接收?
- java - Mockito 测试抛出异常的 void 方法。Spring Boot、Eclipse IDE
- node.js - 从外部 .json 文件加载默认数据并存储到 MongoDB