有没有办法将RewriteBase设置为相对于主机根目录的路径当前文件夹(.htaccess文件所在的文件夹)?

我有一个CMS,如果将其移动到主机中的目录中,则除非将RewriteBase设置为相对于主机根的目录路径,否则它不起作用。我希望我的CMS仅可复制和粘贴,而不更改htaccess中的任何代码。

更新:

例如:

webroot

 - sub_directory
 - cms
 - .htaccess

在这种情况下,我应该在htaccess中写:RewriteBase /
如果将htaccess移到sub_directory内部,则应将RewriteBase更改为:
RewriteBase /sub_directory/
所以我想要像
RewriteBase /%{current_folder}/

最佳答案

这是一种获取环境变量中的RewriteBase的方法,然后可以将其用于其他重写规则:

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

然后,您可以在规则中使用%{ENV:BASE}表示RewriteBase,即:
#redirect in-existent files/calls to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . %{ENV:BASE}/index.php [L]

说明:

该规则通过将REQUEST_URIRewriteRule看到的URL路径进行比较来工作,该URL路径是去除了开头的REQUEST_URIRewriteBase。区别是RewriteBase,并放入%{ENV:BASE}中。
  • RewriteCond中,LHS(测试字符串)可以使用反向引用变量,例如$1$2%1%2等,但RHS方面,即条件字符串无法使用这些$1$2%1%2变量。
  • 在RHS条件部分中,我们只能使用的向后引用是内部向后引用,即我们在此条件本身中捕获的组。它们由\1\2等表示。
  • RewriteCond中,第一个捕获的组是(.*?/)。它由内部反向引用\1表示。
  • 您可以确定,该规则基本上是通过比较RewriteBase%{REQUEST_URI}动态地找到$1的。 %{REQUEST_URI}的示例将是/directory/foobar.php,而同一示例URI的$1的示例将是foobar.php^(.*?/)(.*)::\2$将差异放在第一个捕获的组%1\1中。对于我们的示例,它将使用值%1填充\1/directory/,稍后将在%{ENV:BASE}中设置env变量E=BASE:%1时使用该值。
  • 10-08 15:23