0

PHP $_SERVER['...']诸如 for '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. 调用 '/sub/dir' SUB_DIR。我还想要为友好的 url 重写规则,例如www.example.com/sub/dir/route/key1/val1/key2/val2.

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

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

$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

4

1 回答 1

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/
于 2018-02-05T20:46:24.870 回答