【发布时间】:2015-08-04 14:51:04
【问题描述】:
我已经为我的网站定义了一个具有此代码的 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 值。
我的代码有什么问题,我该如何解决?
【问题讨论】:
-
Apache 加载/运行模块的顺序有一个怪癖 - mod_rewrite 总是在 SetEnv 之前运行,因此您不能使用 SetEnv 设置要在 RewriteRiule 中使用的环境变量;但是您可以使用 RewriteRule 设置变量;例如
RewriteRule .* - [E=BASE_PATH:/cig/base3] -
@CD001 我不完全理解为什么要以这种方式使用它,但是当我将您的代码插入到我的 htaccess 文件中时,它按预期工作。您是否有更多描述/细节的参考资料以及非经验用户的示例?或者请描述更多。
标签: php apache .htaccess mod-rewrite