'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
,而实际上它预计会发现它的安装位置。
关于如何为$workingRequest
和public 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);
}
}
获取正确值的任何好的(甚至是坏的)想法?
答案 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/