查找 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/
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/