我正在使用自己制作的PHP CMS。它获取$ _GET参数url
并将其转换为www.website.com/{url}
。此CMS使用$ _GET参数来获取文件。因此,如果url
为index
,则CMS会搜索文件index
并返回文件的内容。但现在,我正在扩展CMS以使用profile/{username}
之类的附加参数。我该如何扩展呢?我希望我的网址说www.website.com/profile/{username}
。我该怎么做呢?这是我目前的htaccess:
RewriteEngine On
RewriteRule ^(|/)$ index.php?url=$1
RewriteRule ^([a-zA-Z0-9_-]+)(|/)$ index.php?url=$1a
这是TPL系统。
public function addTpl() {
global $zip;
if(!isset($_GET['url']) || empty($_GET['url'])) {
$_GET['url'] = 'index';
}
if(file_exists('_zip/_templates/_front/'. $zip['Template']['Front'] . '/')) {
if(file_exists('_zip/_templates/_front/'. $zip['Template']['Front'] . '/' . secure($_GET['url']) . '.php')) {
ob_start();
include('_zip/_templates/_front/'. $zip['Template']['Front'] . '/' . secure($_GET['url']) . '.php');
$this->tpl .= ob_get_contents();
ob_end_clean();
} else {
die(zipError('File Not Found', 'The file <b>' . secure($_GET['url']) . '</b> could not be found. Please re-check the URL; If you were directed here using a link, please report that link.'));
}
} else {
die(zipError('Template Not Found', 'The template <b>' . $zip['Template']['Front'] . '</b> could not be found. Please check your configuration file for a mistake.'));
}
}
我需要提供其他信息吗?我需要尽快完成这项工作,所以任何建议都会非常感激。
答案 0 :(得分:3)
在包含文件之前,您可以将第二个参数({username})作为局部变量,然后您可以在其中将其作为普通变量进行访问。如果你和团队合作,这不是一件好事。
修改强>:
您可以做的是以下
RewriteEngine On
RewriteRule ^ index.php
然后在index.php中你可以拥有这个
$url = str_replace('index.php','', $_SERVER['PHP_SELF']);
$url = str_replace($url,'',$_SERVER['REQUEST_URI']);
$url = explode('/',$url);
$page = array_shift($url);
foreach ($url as $val){
$args[] = urldecode($val);
}
现在,如果您打开链接www.website.com/profile/someuser/about
,您将拥有
$page = 'profile'
$args[0] = 'someuser'
$args[1] = 'about'
依此类推,你可以拥有自己喜欢的论点。
答案 1 :(得分:1)
php_nub_qq的答案更清晰:从长远来看,通过使用$_SERVER['REQUEST_URI']
而不是每次要在CMS中添加新细分时添加更多重写规则,这样做会更好。但是,无论如何,我已经回答了以下问题,因为你不想更新你现有的代码,因为你是在枪口下。
另外,您需要花费很大的精力来避免在addTpl()中设置任何变量。这是有充分理由的,因为php_nub_qq也已经指出,这是为了避免在子模板中设置任何会违反封装的变量。但是现在你必须为该方法添加更多逻辑,这是一个麻烦的约束,所以你应该将模板包含分解为私有方法。然后你可以在你想要的addTpl()中做任何复杂的逻辑。为了避免在模板文件中设置除$this
之外的任何变量,您可以在模板对象本身上设置模板文件的路径,并在将其传递给模板包含方法时使用它。
所以,你会添加另一个重写规则:
RewriteRule ^profile/([a-zA-Z0-9_-]+)(|/)$ index.php?username=$1
编辑:我在破坏此版本的正则表达式的开头删除了额外的斜杠。
这将在$_GET
中设置用户名密钥,您可以使用该密钥切换要加载的模板。然后在addTpl()所在的任何类中执行以下操作(这也假设您更改配置以添加与$zip['Template']['Profile']
类似的$zip['Template']['Front']
来设置配置文件模板的目录:
class Template {
public $tpl = '';
private $_template_file;
public function addTpl() {
global $zip;
if(!isset($_GET['url']) || empty($_GET['url'])) {
$_GET['url'] = 'index';
}
$top_dir = '_zip/_templates/';
$type_dir = '_front/';
$configured = $zip['Template']['Front'];
$file = $_GET['url'];
// Check username val and use custom template:
if (!empty($_GET['username'])) {
$type_dir = '_profile/';
$configured = $zip['Template']['Profile']; // assuming you're configuring profile templates
$file = $_GET['username'];
}
$full_dir = $top_dir . $type_dir . $configured . '/';
if(file_exists($full_dir)) {
$full_file = $full_dir . secure($file) . '.php';
if(file_exists($full_file)) {
$this->_template_file = $full_file;
$this->tpl .= $this->loadTemplate();
} else {
die(zipError('File Not Found', 'The file <b>' . secure($file) . '</b> could not be found. Please re-check the URL; If you were directed here using a link, please report that link.'));
}
} else {
die(zipError('Template Not Found', 'The template <b>' . $configured . '</b> could not be found. Please check your configuration file for a mistake.'));
}
}
private function loadTemplate() {
ob_start();
include($this->_template_file);
$result = ob_get_contents();
ob_end_clean();
return $result;
}
}