在一个项目中,我在许多子目录中都有.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/
并对其进行了测试,我找不到网站等等!
任何想法?
感谢
答案 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}}反向引用,注意在检查任何条件之前部分评估规则本身(应用模式)。