子目录中的htaccess rewritebase

时间:2014-04-03 14:59:24

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

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

这是一个结构示例:

项目/ htaccess的

项目/管理/ htaccess的

项目/管理/ PDF / htaccess的

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

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

如果项目文件夹直接放在根目录中,这可以正常工作。 所有其他子目录具有相同的htaccess逻辑,现在如果用户需要将项目放在任何其他目录而不是root中,他/她必须更改项目所有子目录中所有htaccess文件中的所有RewriteBase。

我的问题:如何重写我的htaccess内容,所以我得到了与上面提到的相同的结果,但是" dynamic"基地还是没有基地...等? 我尝试了一些没有成功的事情。

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

任何想法?

感谢

1 个答案:

答案 0 :(得分:3)

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

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}进行比较,BASE整个URI,包括基础。这种比较使我们得到了被剥离的部分或基础,并且将存储在^$环境变量中。

RewriteCond %{ENV:BASE} ^$ RewriteCond $1::%{REQUEST_URI} ^(.*)::(.*?)\1$ RewriteRule ^(.*)$ - [ENV=BASE:%2] 匹配的条件只是确保这是第一次通过规则(意味着没有设置任何环境变量)。重写引擎将循环,因此我们只想将第一次设置


编辑:实际上,现在我正在看它,你可能会把第一个留下来:

$1

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