【发布时间】:2016-01-05 07:46:18
【问题描述】:
我正在为 php 应用程序制作一个工具包。我已经根据一些约定制作了一个路由系统,它运行良好,但我想学习如何制作 mod_rewrite 规则或任何其他东西,以最终使 url 易于查看并有利于 seo。
路由系统从设置应用程序和 url 根的配置文件开始。
$app_root = $_SERVER["DOCUMENT_ROOT"].dirname($_SERVER["PHP_SELF"])."/";
$app_url = $_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']).'/';
define("APP_URL",$app_url);
define("APP_ROOT",$app_root);
路由总是从 index.php 开始,这使得 controllers@actions 的实例来自 GET 参数 controllers=?&action=?
这是 index.php
<?php
include_once 'controller/Frontend.php';
require 'libraries/Router.php';
$params=array();
if(isset($_GET['controller'])&&isset($_GET['action'])){
$c = $_GET['controller'];
$a = $_GET['action'];
// add all query string additional params to method signature i.e. &id=x&category=y
$queryParams = array_keys($_GET);
$queryValues = array_values($_GET);
for ($i=2;$i<count($queryParams);$i++) {
$params[$queryParams[$i]] = $queryValues[$i];
}
if ($_POST) {
// add all query string additional params to method signature i.e. &id=x&category=y
$queryParams = array_keys($_POST);
$queryValues = array_values($_POST);
for ($i=0;$i<count($_POST);$i++) {
$params[$queryParams[$i]] = $queryValues[$i];
}
}
include_once APP_ROOT."/controller/$c.php";
$controller = new $c();
$controller->$a($params);
} else {
//attiva controller predefinito
$controller = new Frontend();
$controller->index();
}
这允许选择路由器必须调用的控制器和操作。
这里的router函数从root的settings.php中获取APP URL。您将两个 controllers@action 参数作为字符串提供给我,它使 URL 如下所示: index.php?controller=X&action=Y&[参数...]
<?php
需要'./settings.php';
function router($controller,$action,$query_data="") {
$param = is_array($query_data) ? http_build_query($query_data) : "$query_data";
$url = APP_URL."index.php?controller=$controller&action=$action&$param";
return $url;
}
function relativeRouter ($controller,$action,$query_data=""){
$param = is_array($query_data) ? http_build_query($query_data) : "$query_data";
$url = "index.php?controller=$controller&action=$action&$param";
return $url;
}
function redirectToOriginalUrl() {
$url = $_SERVER['HTTP_REQUEST_URI'];
header("location: $url");
}
function switchAction ($controller, $action) {
$r = router($controller, $action);
header("location:$r", true, 302);
}
在模板文件中,我调用 router('controller,'action') 来检索 url 到操作并传递 GET/POST 数据(从 index.php 收集,将它们作为数组放入方法签名中)。
不要怪我在没有过滤的情况下使用全局 POST/GET,我还在开发这个东西,以后会做安全的事情;)
我想问一下是否有人可以分享一些关于如何制作漂亮的网址(如网站/页面/操作)的想法...... 例如 www.site.com/blog/post?id=1
(实际上路由器函数 ($query_data) 中的 N 个参数是这样工作的,你传递 array['id' => '1'] 得到 ?id=1)
制作好网址的最佳策略是什么? 非常感谢,还在学习PHP。
如果有最好的方法来做这些事情,请提供您的反馈。
【问题讨论】:
标签: php .htaccess mod-rewrite url-rewriting url-routing