PHP URI映射功能

时间:2013-01-29 02:28:23

标签: php routing uri

我正在开发一个php应用程序,它将使用与MVC系统相同的主体,但是,我不想使用类。我想要完成的是拥有SEO URL(mysite.com/product/Some-Cool-Product/123)而无需课程。这些方法将改为使用函数。我遇到的最大问题是将URI映射到适当的文件和函数。例如,mysite.com/members/profile/123将指向文件'sources / members.php',然后调用'profile'函数。导致问题的原因是添加了为源文件使用目录的功能。如果我想使用诸如'mysite.com/forums/threads/view/12345'之类的网址,则会指向'sources / forums / threads.php',并将id作为参数调用'view'函数。

有人可以帮我解决这个问题吗?这是我到目前为止所拥有的。

<?php 

$uri = $_SERVER['REQUEST_URI'];

$uri = ltrim($uri, '/');

$uri_segments = explode('/', $uri);

$invalid = 0;

foreach($uri_segments as $key => $val){

    if(!preg_match('^[a-z0-9]^', $val)){

        $invalid = $invalid + 1;

    }

}

if($invalid > 0){

    die('Could not execute the script... the uri contains invalid characters.');

} else {

    //Load the script.

}

?>

<?php $uri = $_SERVER['REQUEST_URI']; $uri = ltrim($uri, '/'); $uri_segments = explode('/', $uri); $invalid = 0; foreach($uri_segments as $key => $val){ if(!preg_match('^[a-z0-9]^', $val)){ $invalid = $invalid + 1; } } if($invalid > 0){ die('Could not execute the script... the uri contains invalid characters.'); } else { //Load the script. } ?>

2 个答案:

答案 0 :(得分:1)

我将假设你在这里使用LAMP堆栈(Linux / Apache / MySQL / PHP)。

如果您使用Apache作为Web服务器,则可以使用重写规则在公共目录中设置.htaccess文件,该规则将自动为您执行此操作。所以,当有人点击时:

http://www.mysite.com/forums/threads/view/12345

它会自动加载'sources / members.php'并将URL中的id作为get参数传入$ _GET数组中。

在索引(index.html / index.php)文件所在的目录中,创建一个名为的文件。“htaccess”

.htaccess 文件的示例如下:

    RewriteEngine On
    RewriteRule ^forums/threads/view/([0-9]+) sources/members.php?thread_id=$1

如果这不起作用,可能是因为您的Apache配置配置错误或重写规则格式不正确。无论哪种方式,这比使用PHP快得多,不仅代码编写明智,而且性能也是如此。

这里有一个可能有用的外部资源: http://corz.org/serv/tricks/htaccess2.php

答案 1 :(得分:0)

使所有非文件的请求都通过index.php。制作一个Router.php - 在index.php中要求它 - 在Router.php中解析请求并包含你需要的文件。

在你的Router.php中,你至少需要知道在uri中寻找的模式。尝试以某种形式的XML映射此模式,任何无法与您的模式匹配的内容都应该转到404页面。

抱歉,模糊......但这是一个很大的问题。有人可以详细说明它。