You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取当前.htaccess文件所在目录的路径?

解决.htaccess中动态获取当前目录路径用于文件检查的问题

我明白你的痛点:当.htaccess放在子目录(比如/var/www/mytestsite)时,%{DOCUMENT_ROOT}始终指向服务器配置的根目录(/var/www),导致你必须硬写子目录名才能让文件检查生效。下面给你几个可靠的解决方案,不用硬编码目录名:

方案1:使用%{CONTEXT_DOCUMENT_ROOT}(推荐,Apache 2.4+)

Apache 2.4及以上版本提供了%{CONTEXT_DOCUMENT_ROOT}变量,它会自动指向当前.htaccess所在目录对应的上下文文档根。对于你的场景,这个变量的值就是/var/www/mytestsite,完美匹配你的需求。

修改后的规则如下:

RewriteCond %{CONTEXT_DOCUMENT_ROOT}/controllers/$1\.php -f
RewriteRule ^(.*)\.html$ index.php?lang=en&module=$1 [L]

这个方案最简洁,完全动态,不用额外配置。

方案2:结合%{DOCUMENT_ROOT}和%{REWRITE_BASE}(兼容Apache 2.2+)

如果你还在使用Apache 2.2,可以先设置RewriteBase指向当前子目录,然后将它和%{DOCUMENT_ROOT}拼接,得到正确的文件路径。

步骤如下:

  1. 先在.htaccess开头设置RewriteBase(对应你的子目录路径):
RewriteBase /mytestsite/
  1. 修改RewriteCond规则,拼接两个变量:
RewriteCond %{DOCUMENT_ROOT}%{REWRITE_BASE}controllers/$1\.php -f
RewriteRule ^(.*)\.html$ index.php?lang=en&module=$1 [L]

这里%{DOCUMENT_ROOT}是/var/www,%{REWRITE_BASE}是/mytestsite/,拼接后就是/var/www/mytestsite/controllers/,和你硬写的路径一致,但只需要在RewriteBase中维护目录名一次。

方案3:从%{REQUEST_FILENAME}提取目录(兼容旧版本,无需RewriteBase)

如果不想设置RewriteBase,可以通过%{REQUEST_FILENAME}提取当前请求对应的文件系统目录(也就是.htaccess所在的目录):

# 先提取当前请求的文件所在目录,存入环境变量HTACCESS_DIR
RewriteCond %{REQUEST_FILENAME} ^(.*)/[^/]+$
RewriteRule ^ - [E=HTACCESS_DIR:%1]

# 使用环境变量进行文件检查
RewriteCond %{ENV:HTACCESS_DIR}/controllers/$1\.php -f
RewriteRule ^(.*)\.html$ index.php?lang=en&module=$1 [L]

这个方案的原理是:当请求localhost/mytestsite/something.html时,%{REQUEST_FILENAME}的值是/var/www/mytestsite/something.html,通过^(.*)/[^/]+$捕获到的%1就是/var/www/mytestsite,也就是.htaccess所在的目录。

补充说明:为什么RewriteBase不影响%{DOCUMENT_ROOT}?

%{DOCUMENT_ROOT}是服务器全局配置的DocumentRoot值,和.htaccess的位置无关;而RewriteBase只是用来调整URL重写时的路径基准,仅作用于URL层面,不会改变文件系统路径相关的变量,所以它无法影响%{DOCUMENT_ROOT}的取值。

内容的提问来源于stack exchange,提问作者Grzegorz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:29:53