从URI和Web Root中提取公共路径

时间:2012-07-23 22:10:47

标签: php perl url-routing

我有一个带有路由器路由URL的自建MVC fw,以便使用公共example.com/controller/action。当我的应用程序部署在子目录(例如

)中时,我遇到了问题

example.com/my_app/controller/action/?var=value

我的路由器认为my_app现在是控制器的名称,controller是方法。

我目前的解决方案是在安装时手动询问配置中的任何子目录名称。我想手动完成这个。请参阅下面的问题,让我知道我是否会以错误的方式解决问题并提出错误的问题。

我的问题: 如果我有两条路径,如何从一条路径的末端截断常见的碎片并将其从另一条路径的末端移除。

A = / var / www / my_app / pub B = / my_app / pub / cntrl / actn

从B中删除/ my_app / pub并保留/ cntrl / actn最快的一个班轮是什么? 基本上寻找一种像字符串一样的公共分母的perl-esque方式。

感谢任何输入

2 个答案:

答案 0 :(得分:3)

my @physical_parts = split qr{/}, $physical_path;
my @logical_parts  = split qr{/}, $logical_path;

my @physical_suffix;
my @logical_prefix;
my $found = 0;
while (@physical_parts && @logical_parts) {
    unshift @physical_suffix, pop(@physical_parts);
    push @logical_prefix, shift(@logical_parts);

    if (@physical_suffix ~~ @logical_prefix) {
       $found = 1;
       last;
    }
}

答案 1 :(得分:1)

我要解决此问题的方法是将此逻辑添加到front controller(服务器向其发送所有不存在的文件请求的文件,通常是index.php)。

$fontControllerPath = $_SERVER['SCRIPT_NAME'];
$frontControllerPathLength = strlen($fontControllerPath);

$frontControllerFileName = basename($fontControllerPath);
$frontControllerFileNameLength = strlen($frontControllerFileName);

$subdirectoryLength = $frontControllerPathLength - $frontControllerFileNameLength;

$url = substr($_SERVER['REQUEST_URI'], $subdirectoryLength - 1);

Here's a codepad demo

这是做什么的?如果前控制器(相对于www根)位于:/subdir/myapp/中,那么它的$_SERVER['SCRIPT_NAME']将是/subdir/myapp/index.php。实际请求URI包含在$_SERVER['REQUEST_URI']中。比方说,例如,它是/subdir/myapp/controller/action?extras=stuff。要删除子目录前缀,我们需要找到它的长度。这可以通过从脚本名称相对于www根的长度中减去脚本名称的长度(从basename()中检索)来找到。

File that receives request: /subdir/myapp/index.php (length = 23)
Filename: index.php                                 (length = 9)
                                                                 -
-------------------------------------------------------------------
                                               14 chars to remove

/subdir/mpapp/controller/action?extras=stuff
              ^
              Cut off everything before here