使用Apache .htaccess设置DYNAMIC Php $ _SERVER值($ _SERVER ['something'])

时间:2012-06-28 20:27:41

标签: php apache .htaccess

这是this question的一种表现,我们知道可以使用$_SERVER设置SetEnv var。

接下来的问题是:有没有办法像这样使用SetEnv:

/var/www/www.example.com/module/unique_section/.htaccess:

SetEnv RESOURCE_ROOT %{DIRECTORY}

/var/www/www.example.com/module/unique_section/some/path/file.php

<?php echo $_SERVER['RESOURCE_ROOT']; ?>

输出:/var/www/www.example.com/module/unique_section/

3 个答案:

答案 0 :(得分:5)

根据您需要的信息,可以使用RewriteRule执行此操作。例如:

RewriteEngine On
RewriteCond %{DOCUMENT_ROOT} (.*)
RewriteRule (.*) - [E=RESOURCE_ROOT:%1]

将PHP var $_SERVER['RESOURCE_ROOT']$_SERVER['REDIRECT_RESOURCE_ROOT']设置为Apache Document Root。有关详细信息,请参阅the mod_rewrite manual,但%{DOCUMENT_ROOT}%{PATH_INFO}%{REQUEST_FILENAME}的某些组合可能适合您。

我认为.htaccess文件不可能知道它所在的目录。所以我认为你需要在.htaccess文件中使用硬编码路径。举个例子:

RewriteEngine On
RewriteCond %{DOCUMENT_ROOT} (.*)
RewriteRule (.*) - [E=RESOURCE_ROOT:%1/module/unique_section/]

答案 1 :(得分:4)

据我所知,setEnv无法访问apache环境变量。所以%{DIRECTORY}不起作用,除非您希望该值专门为“%{DIRECTORY}”。使用mod_rewrite,这对我来说是有用的,可以获取正在加载文件的路径:

RewriteEngine On

RewriteCond %{SCRIPT_FILENAME} ((.*)/)
RewriteRule (.*) - [E=RESOURCE_ROOT:%1]

输出:

var_dump(__FILE__);
//outputs: string(27) "/var/www/sub/test/index.php" 
var_dump($_SERVER['RESOURCE_ROOT']);
//outputs: string(24) "/var/www/sub/test/"

除此之外,使用php并执行dirname(__FILE__)dirname($_SERVER['PHP_SELF'])是否有任何问题?

答案 2 :(得分:2)

您可以使用apache_getenv功能获得所需内容。

链接:http://php.net/manual/en/function.apache-getenv.php

不要忘记阅读文档:

  

此功能需要Apache 2 ,否则未定义。

示例:

<?php
$ret = apache_getenv("SERVER_ADDR");
echo $ret;
?>

以上示例将输出类似于:

的内容
42.24.42.240

但是,正如此威胁中所建议的那样,您可以使用dirname(__FILE__),从PHP 5.3.0开始,您可以使用__DIR__作为魔术常量。