有没有办法将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_URI
与RewriteRule
看到的URL路径进行比较来工作,该URL路径是去除了开头的REQUEST_URI
的RewriteBase
。区别是RewriteBase
,并放入%{ENV:BASE}
中。RewriteCond
中,LHS(测试字符串)可以使用反向引用变量,例如$1
,$2
或%1
,%2
等,但RHS方面,即条件字符串无法使用这些$1
,$2
或%1
,%2
变量。 \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
时使用该值。