2

对,大家下午好(好吧,现在是英国的下午!)

我正在编写一个使用友好 URL 的 (PHP/MySQL) 站点。

我已经设置了我的 htaccess(启用了 mod_rewrite)并有一个可以处理“/”的基本脚本,然后在“?”之后处理其他所有内容。在同一个脚本中。即我能够确定用户是否尝试放置example.com/aboutexample.com/about/the-team等等example.com/join/?hash=abc123etc

我的问题是如何处理可变长度 URL,例如(示例):

example.com/about(node only)
example.com/about/the-team(node + seo-page-title)
example.com/projects(node only)
example.com/projects/project-x(node + sub-node)
example.com/projects/project-x/specification(node + sub-node + seo-friendly-title)
example.com/news/article/new-article(node + sub-node + seo-friendly-title)
example.com/join/?hash=abc123etc&this=that(节点 + 查询对)

但是,“节点”(第一个参数)、“子节点”(第二个参数)或“seo 友好的页面标题”可能会丢失或未知(数据库控制),因此我无法将处理具体放在 .htaccess 中。请记住:我已经(我认为!)有一个工作 htaccess 可以将所有内容正确转发到我的 PHP 处理脚本。未找到的所有内容都将被转发到 CMS“404”。

我认为我的客户最多会有三个参数(然后其他所有参数都将在“?”之后)。

有没有人尝试过这个或者有一个地方从数据库结构开始或者如何处理我是否已经提出了上述任何一种可能性?

我在以前的项目中尝试过,但总是不得不求助于编写 CMS 来强制用户(在添加页面时)至少拥有一个节点或一个节点 + 子节点 + seo-friendly-title,我想离开从...

我不想要一个脚本,它会通过尝试找到参数的每一种可能性直到找到匹配项来给数据库搜索带来太大压力......或者如果我想实现我所要求的,这是唯一的方法?

非常感谢!

4

2 回答 2

1

您可以像这样满足不同数量的比赛:

RewriteRule ^/([^/])* /content.php?part1=$1 [L,QSA,NC]  
RewriteRule ^/([^/])*/([^/])* /content.php?part1=$1&part2=$2 [L,QSA,NC] 
RewriteRule ^/([^/])*/([^/])/([^/])* /content.php?part1=$1&part2=$2&part3=$3 [L,QSA,NC] 

其中 [ ^ / ] 匹配除 '/' 以外的任何字符 - 然后因为该术语包含在 () 括号中,所以它可以在重写的 URL 中使用。

QSA 将处理所有参数并将它们正确附加到重写的 URL。

您如何将零件与您所知道的事物相匹配取决于您,但我认为这样的事情是明智的:

$knownKnodes = array(
    'about',
    'projects',
    'news',
    'join',
);

$knownSubNodes = array(
    'the-team',
    'project-x',
    'the-team'
);

$node = FALSE;
$subNode = FALSE;
$seoLinks = array();

if(isset($part1) == TRUE){
    if(in_array($part1, $knownNodes) == TRUE){
        $node = $part1;
    }
    else{
        $seoLinks[] = $part1;
    }
}

if(isset($part2) == TRUE){
    if(in_array($part2, $knownSubNodes) == TRUE){
        $subNode = $part2;
    }
    else{
        $seoLinks[] = $part2;
    }
}

if(isset($part3) == TRUE){
     $seoLinks[] = $part3;
}
if(isset($part4) == TRUE){
     $seoLinks[] = $part4;
}

显然,节点和子节点的列表可以从数据库中提取,而不是硬编码。如何将已知事物与自由文本匹配的确切细节完全取决于您。

于 2012-06-26T14:58:48.903 回答
0

php脚本在哪种结构中获取信息?

如果“example.com/news/article/new-article”的结构是

$_GET[a]=news
$_GET[b]=article
$_GET[c]=new-article

你可以检查是否$_GET[c]为空;如果不是真正的网站$_GET[b],等等...

另一种方法是$_GET[a]返回一些东西,就像'news_article_new-article' 在这种情况下你有一个唯一的数据库搜索名称

我希望我理解你的正确

于 2012-06-26T14:07:59.153 回答