Php 如何在.htaccess文件中定义变量并使用它?

Php 如何在.htaccess文件中定义变量并使用它?,php,apache,.htaccess,mod-rewrite,Php,Apache,.htaccess,Mod Rewrite,我已为我的网站定义了一个htaccess文件,其代码如下: RewriteEngine on RewriteBase / RewriteRule ^bit_auth\/?(.*)$ /cig/base3/auth/$1 [R=301,NC,L] RewriteCond $1 !^(index\.php|images|robots\.txt|assets|themes|includes) RewriteRule ^(.*)$ /cig/base3/index.php/$1 [L] 我希望将我的

我已为我的网站定义了一个htaccess文件,其代码如下:

RewriteEngine on
RewriteBase /

RewriteRule ^bit_auth\/?(.*)$ /cig/base3/auth/$1 [R=301,NC,L]
RewriteCond $1 !^(index\.php|images|robots\.txt|assets|themes|includes)
RewriteRule ^(.*)$ /cig/base3/index.php/$1 [L]
我希望将我的站点根路径保存在变量中,如下所示:

RewriteEngine on
RewriteBase /
SetEnv BASE_PATH "/cig/base3"

RewriteRule ^bit_auth\/?(.*)$ %{ENV:BASE_PATH}/auth/$1 [R=301,NC,L]
RewriteCond $1 !^(index\.php|images|robots\.txt|assets|themes|includes)
RewriteRule ^(.*)$ %{ENV:BASE_PATH}/index.php/$1 [L]
因为我以后可能需要在更多代码中使用
BASE\u PATH
值,而且它可能会被更改,我不想每次都在htaccess文件中搜索和替换。 但是当我使用上面的代码时,htaccess文件
%{ENV:BASE_PATH}
中的返回一个空值,而不是预期的
/cig/base3
,但在php中使用:

<?php $specialPath = getenv('BASE_PATH'); var_dump($specialPath)?>

它显示了
/cig/base3
的正确值


我的代码中有什么问题?我如何解决这个问题?

您不能这样使用
SetEnv
,因为它尚未处理

此指令设置的内部环境变量在 大多数早期的请求处理指令都是运行的,例如access 控件和URI到文件名的映射。如果环境变量 您的设置意味着作为此早期处理阶段的输入 例如RewriteRule指令,您应该改为设置 带有SetEnvIf的环境变量

您要找的是
setenif
而不是
SetEnv

所以你应该可以做一些类似的事情

SetEnvIf Request_URI "^.*" base_path=/cig/base3

Apache加载/运行模块的顺序有一个怪癖——mod_rewrite总是在SetEnv之前运行,因此您不能使用SetEnv设置要在RewriteRiule中使用的环境变量;但是,您可以使用重写规则设置变量;e、 g.
RewriteRule.*-[e=BASE\u PATH:/cig/base3]
@CD001我不太明白为什么要这样使用它,但当我将您的代码插入我的htaccess文件时,它按预期工作。对于更多的描述/细节,以及非经验用户的示例,您是否有任何参考资料?或者请详细描述一下。^@mrez.ir这就是我的评论。。。我在工作,所以我没有时间写一个格式完整、条理清晰的答案;)SetEnvIf(与SetEnv不同)将在mod_rewrite之前运行-但是您也可以使用mod_rewrite本身设置环境变量-两者都可以工作。但是这两个答案都是正确的,我不明白为什么要用这些方法来做?还有哪一个更正确?@mrez.ir-两者都在做相同的事情,只是方式不同-无论哪种方式,最终都会得到一个环境变量集。如果我使用重写规则的变量,我更喜欢通过重写规则来完成。。。但这真的没关系。它会减缓原始的htaccess行为吗?我的意思是加载一些东西两次?@mrez.ir.htaccess在扫描目录时只读取一次,但是.htaccess在每次请求时都会读取,并且所有内容都会相应地进行处理。因此,它不会真正引入比默认行为更慢的速度。