php - 子目录中的 htaccess 重写库

标签 php .htaccess mod-rewrite url-rewriting subdirectory

在一个项目中,我的许多子目录中有 .htaccess 文件。

这是一个示例结构:

project/.htaccess

project/admin/.htaccess

project/admin/pdf/.htaccess

在最后一个中,我成功地使用了以下内容:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /project/admin/pdf/
RewriteRule ^([pdf\.actions]+)$ pdf.out.actions.php [QSA]

如果项目文件夹直接放在根目录中,则效果很好。 所有其他子目录都有相同的 htaccess 逻辑,现在如果用户需要将项目放在任何其他目录而不是根目录中,他/她必须更改项目所有子目录中所有 htaccess 文件中的所有 RewriteBase。

我的问题:如何重写我的 htaccess 内容,以便我得到与上面提到的相同的结果,但使用“动态”基础或没有基础...等? 我尝试了很多事情但没有成功。

我删除了行RewriteBase/project/admin/pdf/并对其进行了测试,我发现网站未找到...等等!

有什么想法吗?

谢谢

最佳答案

您可以尝试在规则顶部添加如下内容:

RewriteCond %{ENV:URI} ^$
RewriteRule ^(.*)$ - [ENV=URI:$1]

RewriteCond %{ENV:BASE} ^$
RewriteCond %{ENV:URI}::%{REQUEST_URI} ^(.*)::(.*?)\1$
RewriteRule ^ - [ENV=BASE:%2]

然后不要使用RewriteBase ,您必须包含 BASE环境变量无处不在。例如:

RewriteRule ^([pdf\.actions]+)$ %{ENV:BASE}/pdf.out.actions.php [QSA]

这些条件会执行一些操作,但这两个规则不会更改 URI 中的任何内容,仅添加环境变量。

第一个条件是必要的,因为它在对请求的 URI 执行任何操作之前先获取它并存储它。这很重要,因为(.*)规则中的分组已剥离基础。我们想要未改变的 URI,并且去掉了基础。所以URI环境变量是去掉基数的 URI。

第二个条件是必要的,因为它比较 URI环境变量 %{REQUEST_URI} ,这是整个 URI,包括基础。该比较为我们提供了被剥离的部分或基础,并将其存储在 BASE 中环境变量。

^$ 匹配的条件只是确保这是第一次通过规则(意味着没有设置任何环境变量)。重写引擎将循环,因此我们只想第一次设置这些。


编辑:实际上,现在我正在看它,您可能可以省略第一个:

RewriteCond %{ENV:BASE} ^$
RewriteCond $1::%{REQUEST_URI} ^(.*)::(.*?)\1$
RewriteRule ^(.*)$ - [ENV=BASE:%2]

使用$1与规则匹配的反向引用,注意在检查任何条件之前,规则本身已部分评估(应用模式)。

关于php - 子目录中的 htaccess 重写库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22841486/

相关文章:

regex - htaccess动态重写规则,统计字符数

.htaccess - 表达式引擎 - 完全删除 index.php

apache - htaccess 通过查询字符串阻止请求

PHP , htaccess : apply page title in URL

regex - htaccess 删除?从 url 和重定向

php - 有没有办法使用 PHP 从 Google Scholar 下载 bibtex

php - 引用 - 如何在 SimpleXML 中处理命名空间(名称中带有冒号的标签和属性)?

javascript - Vue 模板未渲染(控制台中没有错误)

php - 删除但保留数组 php/mysql 中带有 id 的行

javascript - 重写htaccess找不到文件