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


how can I define variable in .htaccess file and use it?

我为我的网站定义了一个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_PATH值,也可能会改变,我不想每次在我的htaccess文件中搜索和替换。但是,当我使用上面的代码,在htaccess文件%{ENV:BASE_PATH}返回一个空值,而不是预期的/cig/base3 ,但在php中,当我调用它:

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

显示/cig/base3的正确值

我的代码有什么问题,我怎么解决这个问题?

你不能这样使用SetEnv,因为它还没有被处理。

由该指令设置的内部环境变量在后面设置大多数早期的请求处理指令都是运行的,比如访问控件和uri到文件名的映射。如果环境变量你所设置的是作为早期处理阶段的输入比如RewriteRule指令,你应该设置

你要找的是setenvif而不是SetEnv

所以你应该可以这样写

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

http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html setenvif