我用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 的文件路径。
所以我在这里做一些假设:
- 您有一个.htaccess文件,其中包含一些重写,例如您在问题中显示的文件。
- 每个重定向可能会将您引导到不同的页面,例如用户.php,管理员.php,xyz.php.。
我认为您正在寻找的信息即/user.php?name=Dan
可以通过 _SERVER 美元提取。
所以现在你需要的是get_filepath_from_htaccess
功能,这个函数应该在你的所有文件上都可用。
如果你有一个通用文件,如config.php,functions.php,它在所有页面(如用户.php,管理员等中都可用(包含或必需.php。
然后你需要把这个函数放在公共文件中,你的函数可能看起来像
function get_filepath_from_htaccess() {
return $_SERVER['SCRIPT_FILENAME'] .
(isset($_SERVER['REDIRECT_QUERY_STRING']) ?
'?' . $_SERVER['REDIRECT_QUERY_STRING'] : '');
}
这将提供从系统根目录的完整路径,因此您不必附加$_SERVER['DOCUMENT_ROOT']
。
您可能需要根据服务器配置对代码进行一些更改,因此只需转储(print_r或var_dump)$_SERVER并提取出所需的信息并更新上述功能