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

时间:2015-05-22 14:17:37

标签: 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]

我希望将我的网站根路径保存在变量中,如下所示:

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 $specialPath = getenv('BASE_PATH'); var_dump($specialPath)?>

显示/cig/base3的正确值。

我的代码中存在问题,我该如何解决?

1 个答案:

答案 0 :(得分:9)

您无法使用SetEnv,因为它尚未处理。

  

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

您要找的是setenvif而不是SetEnv

所以你应该可以做类似

的事情
SetEnvIf Request_URI "^.*" base_path=/cig/base3

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