PHP从URL获取正确的路径

时间:2012-01-07 14:59:56

标签: php url

请考虑以下网址:

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 

很少有事情需要注意:

  1. 理想情况下,test.php永远不会自行执行。相反,它是一个包含文件,它将包含在主目录中的其他文件中和/或子目录中的任何其他文件中。
  2. 请注意,代码足够智能,可以从收到的网址中检测http和https并使用相同的网址。
  3. 它可能是.com域名或.co.au.nm域名,但它仍然可以正确获取。
  4. 删除通过$ _GET收到的所有参数。
  5. 我尝试了以下内容,但没有得到满意的答案:

    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文件中。

    那么我怎样才能实现上述功能呢?

2 个答案:

答案 0 :(得分:1)

您可以使用dirname()功能两次。一旦摆脱文件名(和任何查询字符串变量)和另一次遍历一个目录。

dirname(dirname($_SERVER["REQUEST_URI"]));

请注意,这不适用于网站根目录中的文件。您的所有路径都必须至少有一个文件夹。

实际上,从安全的角度来看,整个方法都值得怀疑。允许客户端传入最终被切断并传递到require_once的路径,使您的应用程序打开path traversal attacks。如果要执行此操作,请确保验证/清理输入。

答案 1 :(得分:0)

查看parse_url功能。它应该给你一个很好的起点。