【问题标题】:PHP Get target file path for requested URL htaccess mod-rewritePHP 获取请求的 URL htaccess mod-rewrite 的目标文件路径
【发布时间】:2016-02-21 05:33:59
【问题描述】:

我使用mod-rewrite 制作漂亮的网址,例如http://example.com/users/Dan 等。

我需要获取所提供 URL 的重写规则,以找到所请求的服务器端文件的路径;但是,这不会发生在活动页面上,所以我不能使用 $_SERVER['REQUEST_URI']$_SERVER['PHP_SELF']___FILE____

我需要这样做:

$url = '/users/Dan';
$path = $_SERVER['DOCUMENT_ROOT'].'/'.get_filepath_from_htaccess($url);

在这种情况下,如果您访问http://example.com/users/Dan,您实际上是在查看http://example.com/user.php?name=Dan

因此,在这种情况下,get_filepath_from_htaccess() 应该返回 /user.php?name=Dan

我曾考虑使用正则表达式运行 .htaccess 文件,但许多重写都是动态的,所以我想这会很混乱,我希望有一个更清洁的解决方案。

更新 我意识到我最初的问题不够精确,我的意图也不清楚。需要明确的是,这正是脚本的用途。

在我的网站上,用户可以创建自定义 URL 并将它们指向现有的 URL。例如,我的个人资料位于 example.com/users/Dan。但是,当我创建自定义 URL (example.com/DansCustomURL) 并将其指向我的个人资料时,它应该从个人资料中获取页面内容而不转发到 example.com/users/Dan

所以,事情是这样的。

404 首先重定向到url.php,它会扫描数据库以查找与请求的 URL 匹配的自定义 URL。如果没有找到,则显示 404 页面。

如果找到文件,url.php 需要确定目标 URL 的文件路径。

【问题讨论】:

  • 你为什么不使用像 AltoRouter 或任何 PHP 路由器包这样的东西?只是问

标签: php regex .htaccess mod-rewrite


【解决方案1】:

好的,所以我在这里做一些假设:

  1. 您有一个 .htaccess 文件,该文件有一些重写,就像您在问题中显示的那样。
  2. 每个重定向都可能将您带到不同的页面,例如 users.php、admin.php、xyz.php..

我认为您正在寻找的信息即/user.php?name=Dan 可以通过 $_SERVER 提取。

所以现在您需要的是get_filepath_from_htaccess 函数,并且该函数应该在您的所有文件中都可用..

如果您有一个通用文件,如 config.php、functions.php,它在所有页面(如 user.php、admin.php 等)中都可用(包括或必需)。

然后你需要把这个函数放在公共文件中,你的函数可能看起来像

function get_filepath_from_htaccess() {
    return $_SERVER['SCRIPT_FILENAME'] . 
            (isset($_SERVER['REDIRECT_QUERY_STRING']) ? 
                '?' . $_SERVER['REDIRECT_QUERY_STRING'] : '');

}

这将给出系统根目录的完整路径,因此您不必附加$_SERVER['DOCUMENT_ROOT']

您可能需要根据您的服务器配置对代码进行一些更改,因此只需获取 $_SERVER 的转储(print_r 或 var_dump)并提取您需要的信息并更新上述函数

【讨论】:

  • 很好的解决方案。不幸的是,它不适用(请参阅更新的问题);但我意识到一个更简单、更干净的解决方案是通过 jquery/ajax 获取目标 URL,因此不需要确定文件路径。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
相关资源
最近更新 更多