查找PHP应用程序的安装目录

时间:2018-02-05 19:23:32

标签: php working-directory predefined-variables

'PHP_SELF'变量(例如'SCRIPT_NAME''REQUEST_URI'/var/www/html让我感到有些困惑。我已经看过(至少有一些)以前关于这些问题的问题,并且可以在某些环境中进行一些测试,但我遇到了意外情况发生的环境。

我编写的应用程序必须可以安装在文档根目录下的任何子目录中。例如,假设文档根目录为/var/www/html/sub/dir,并且该应用程序安装在require()中。我需要在/var/www/html/sub/dir(或其子目录)中的www.example.com://sub/dir个文件,并链接到www.example.com/sub/dir/route/key1/val1/key2/val2中的文件。调用'/ sub / dir'SUB_DIR。我还想要友好网址的重写规则,例如.htaccess

我有一个用于Apache的/var/www/html/sub/dir/index.php和一个用于IIS的web.config来重写以通过$docRoot = $_SERVER['DOCUMENT_ROOT']; $reqUrl = $_SERVER['REQUEST_URI']; $pwd = __DIR__; /* Occuring in www.example.com/sub/dir/index.php) */ /* Expected example value for $pwd: /var/www/html/sub/dir */ $appLinkDir = substr($pwd, strlen(docRoot)); /* Expected example value for $appLinkDir: /sub/dir */ $workingRequest = substr($_SERVER['REQUEST_URI'], strlen(appLinkDir)); /* Expected example value for $workingRequest: /route/key1/val1/key2/val2 */ 发送所有内容。我还没有找到解决nginx或其他问题的需要。

我一直在做类似关注的事情,但更关注一个问题和关于Windows v。真实世界目录分隔符。

/var/www/html/sub/dir

我遇到了一个环境,其中$ pwd是/ var / www / html而不是/ var / www / html / sub / dir。我的猜测是应用程序安装在/ var / www / html(不是/ var / www / html / sub / dir)中,但他们正在从/sub/dir/index.php(或其他东西)进行全局重写。无论如何,$ pwd的意外值给了我$ appLinkDir和$ workingRequest的意外值。

有问题的环境来自第三方代码审核人员,他可能认为我的应用程序预计将安装在$appLinkDir,而实际上它预计会发现它的安装位置。

关于如何为$workingRequestpublic class Dictionary { public Dictionary<string, double> Length {get;} public void References() { Length = new Dictionary<string, double>(Lengths); Length.Add("Feet", 1); Length.Add("Meters", 0.3048); } } 获取正确值的任何好的(甚至是坏的)想法?

1 个答案:

答案 0 :(得分:1)

__DIR__为您提供php文件在磁盘上的目录路径。

除非你将php文件移到磁盘上,否则它不会发生变化。

因此,如果文件位于/var/html/sub/another/dir/index.php __DIR__下,则为/var/html/sub/another/dir/

始终使用__DIR__来包含其他php资源。

现在为URL重写部分:

我遇到了类似的问题,而我所做的只是将整个请求URI传递给我的php脚本并在那里进行解析。

例如:

<?php
echo $_SERVER['REQUEST_URI'];

重写(对于lighttpd作为参考):

url.rewrite-once = (
    # I don't want to route PNG, CSS files with PHP..
    "^/_assets/(.*)$" => "/_assets/$1", 
    "/(.*)$" => "index.php?$1"
)

如果访问/test/blub/blab/,则会调用php脚本并输出完整的URI:

/test/blub/blab/