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

Finding installtion directory of a PHP app

PHP $_SERVER['...'] 变量,例如 'PHP_SELF''SCRIPT_NAME''REQUEST_URI' 让我有些困惑。我已经看到(至少一些)以前关于这些的问题并且可以在某些环境中进行一些测试,但是我 运行 进入了会发生意外事情的环境。

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

我有一个用于 Apache 的 .htaccess 和一个用于 IIS 的 web.config 来进行重写以通过 /var/www/html/sub/dir/index.php 发送所有内容。我没有 运行 需要弄清楚 nginx 或其他。

我一直在做类似以下的事情,但更关心的是一个问题和关于 Windows 与现实世界目录分隔符的关系。

$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 */

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

有问题的环境来自第三方代码审查员,他们可能假设我的应用程序预计会安装在 /var/www/html/sub/dir 中,而实际上它希望发现它的安装位置。

关于如何获得 $appLinkDir$workingRequest 的正确值的任何好(甚至坏)想法?

__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/", 
    "/(.*)$" => "index.php?"
)

如果您访问 /test/blub/blab/,将调用 php 脚本并打印完整的 URI:

/test/blub/blab/