动态将 RewriteBase 设置为当前文件夹路径

2024-03-24

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

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

Update:

例如:

webroot

 - sub_directory
 - cms
 - .htaccess

在这种情况下我应该在 htaccess 中写入:RewriteBase /

如果我将 htaccess 移到子目录中,我应该将 RewriteBase 更改为:

RewriteBase /sub_directory/

所以我想要类似的东西

RewriteBase /%{current_folder}/


这是一种可以获取RewriteBase在环境变量中,然后您可以在其他重写规则中使用该环境变量:

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

然后你可以使用%{ENV:BASE}在你的规则中表示RewriteBase, i.e.:

#redirect in-existent files/calls to index.php
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule . %{ENV:BASE}/index.php [L]

解释:

该规则通过比较REQUEST_URI到 URL 路径RewriteRule看到,这是REQUEST_URI与领先的RewriteBase剥去。区别在于RewriteBase并被放入%{ENV:BASE}.

  • In a RewriteCond,LHS(测试字符串)可以使用反向引用变量,例如$1, $2 OR %1, %2等等,但 RHS 侧即条件字符串不能用 these $1, $2 OR %1, %2变量。
  • 在 RHS 条件部分内,我们可以使用的唯一反向引用是内部反向引用即我们在这种情况下捕获的群体。它们表示为\1, \2 etc.
  • In the RewriteCond第一个捕获组是(.*?/)。它将由内部反向引用表示\1.
  • 正如你所看到的,这条规则基本上是在寻找RewriteBase通过比较动态地%{REQUEST_URI} and $1。一个例子%{REQUEST_URI}/directory/foobar.php和例子$1对于相同的示例 URI 将是foobar.php. ^(.*?/)(.*)::\2$将差异放入第一个捕获组中%1 or \1。对于我们的示例,它将填充%1 and \1与价值/directory/稍后在设置环境变量时使用%{ENV:BASE} in E=BASE:%1.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态将 RewriteBase 设置为当前文件夹路径 的相关文章

随机推荐