我有一个类包含在不同目录中的一堆其他脚本中。有时,此类需要向另一个位于同一目录中的文件发出重定向。我无法以一致的方式工作。
例如:
// file.php
require('../class/include.php');
// include.php
if(/* some condition */) {
$mydir = '...'; // should be '../class' in this example
header("Location: $mydir/setup.php");
die();
}
我已经做了以下有希望的结果,但它似乎并不总是有效,我不确定我是否使用服务器变量错误或者如果配置不正确的实例不起作用
$len = strlen($_SERVER['DOCUMENT_ROOT']);
$mydir = str_replace('\\', '/', __FILE__); // switch slashes for Windows systems
$mydir = substr($mydir, $len, strrpos($mydir, '/') - $len + 1);
注意我想要网址,路径无效,因为我无法重定向到/var/wwwroot/some/directory
或C:\domains\mydomain\some\directory
这可能更像$_SERVER['DOCUMENT_ROOT']
的问题。请注意,我从$_SERVER['DOCUMENT_ROOT']
剥离了__FILE__
的长度,以获取可访问网络的部分。
修改
为了使事情变得更简单,有没有办法为包含的文件而不是父文件获得等效的$_SERVER['REQUEST_URI']
或$_SERVER['PHP_SELF']
?
答案 0 :(得分:2)
您可以使用dirname
$mydir = dirname(__FILE__);
答案 1 :(得分:0)
您的重定向不应该是这样的文件,而应该是URL。
如果您使用相对URL,则无关紧要
文件例如:如果“setup.php”与您现在位于同一目录中
标题(“位置:setup.php”);
如果它位于当前位置的子目录中,例如setup / setup.php
标题(“位置:setup / setup.php”);
请记住,这将发送将URL发送到浏览器,然后浏览器将从新位置提取数据,因此只需使用相对URL,然后整个文件路径问题就会消失。
答案 2 :(得分:0)
您需要使用URL来执行重定向而不是文件路径,因此请尝试以下操作。
$base_url = 'http://example.org';
$path = substr($_SERVER['REQUEST_URI'], 0, strrpos($_SERVER['REQUEST_URI'], '/'));
$file = 'example.php';
header("Location: {$base_url}/{$path}/{$file}";
exit;
$base_url
可以来自$_SERVER['SERVER_NAME']
以获得更自动化的系统。
在发布Location
HTTP标头时不要忘记,您应该指定一个完整的网址,而不是像您在问题中那样的相对网址。请参阅:RFC 1945 Hypertext Transfer Protocol -- HTTP/1.0: 10.11 Location。
答案 3 :(得分:0)
我所做的似乎确实有效,问题似乎是$_SERVER['DOCUMENT_ROOT']
不可靠且不一定正确。找到了一种更好的方法来获取文档根目录here(请看第二个答案)。
$docroot = realpath((getenv('DOCUMENT_ROOT') && ereg('^'.preg_quote(realpath(getenv('DOCUMENT_ROOT'))), realpath(__FILE__))) ? getenv('DOCUMENT_ROOT') : str_replace(dirname(@$_SERVER['PHP_SELF']), '', str_replace(DIRECTORY_SEPARATOR, '/', dirname(__FILE__))));