请考虑以下网址:
http://www.mydomain.com/a/test.php
https://www.mydomain.org/a/b/test.php
http://www.mydomain.co.nr/a/b/c/test.php
https://www.mydomain.com/a/b/c/d/test.php
http://www.mydomain.co.uk/a/b/c/d/e/test.php
https://www.mydomain.co.au.nm/a/b/c/d/e/f/test.php?var1=test1&var2=test2
现在我想在test.php文件中声明一个名为ACTUAL_URL的常量,以便它分别包含以下输出(让我们假设这些URL分别代表网站的主目录,分别按上述顺序):
http://www.mydomain.com/
https://www.mydomain.org/a/
http://www.mydomain.co.nr/a/b/
https://www.mydomain.com/a/b/c/
http://www.mydomain.co.uk/a/b/c/d/
https://www.mydomain.co.au.nm/a/b/c/d/e/
现在考虑一个位于以下位置的文件1.php:
http://www.mydomain.com/1.php
https://www.mydomain.org/a/1.php
http://www.mydomain.co.nr/a/b/1.php
https://www.mydomain.com/a/b/c/1.php
http://www.mydomain.co.uk/a/b/c/d/1.php
https://www.mydomain.co.au.nm/a/b/c/d/e/1.php
1.php的PHP代码是:
//1.php
//The folder name may remain as "a" or may change.
//But for most cases, it will be "a"
require_once('a/test.php');
//Rest of the code for the page
很少有事情需要注意:
我尝试了以下内容,但没有得到满意的答案:
define("ACTUAL_URL", basename($_SERVER['PHP_SELF']) );
define("ACTUAL_URL", dirname($_SERVER['PHP_SELF']) );
define("ACTUAL_URL", $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"] );
前两个不提供网站URL,而是它们似乎提供了文件夹的物理路径,这不是必需的。我需要可访问的URL。第三个给出域名+文件夹(这是好的),但包含当前正在执行的页面的文件名和与之关联的任何$ _GET参数。例如,请考虑网站中我的文件的以下结构:
https://www.mydomain.co.au.nm/a/b/c/d/e/1.php?var1=test1&var2=test2
https://www.mydomain.co.au.nm/a/b/c/d/e/f/test.php
在上面的例子中,我希望常量ACTUAL_URL能够给我:
https://www.mydomain.co.au.nm/a/b/c/d/e/
test.php的相对路径将始终包含在1.php文件中。
那么我怎样才能实现上述功能呢?
答案 0 :(得分:1)
您可以使用dirname()
功能两次。一旦摆脱文件名(和任何查询字符串变量)和另一次遍历一个目录。
dirname(dirname($_SERVER["REQUEST_URI"]));
请注意,这不适用于网站根目录中的文件。您的所有路径都必须至少有一个文件夹。
实际上,从安全的角度来看,整个方法都值得怀疑。允许客户端传入最终被切断并传递到require_once
的路径,使您的应用程序打开path traversal attacks。如果要执行此操作,请确保验证/清理输入。
答案 1 :(得分:0)
查看parse_url功能。它应该给你一个很好的起点。