在一个项目中,我的许多子目录中有 .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/