PHP + HTACCESS + mod_rewrite +不同长度的url段

时间:2012-06-26 13:54:12

标签: php friendly-url

是的,下午好(嗯,这是英国的下午!)

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

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

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

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

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

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

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

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

我不希望脚本会对数据库搜索造成太大的压力,试图找到参数的每一种可能性,直到找到匹配为止......或者这是我想要实现的唯一方法在问?

非常感谢!

2 个答案:

答案 0 :(得分: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;
}

显然,节点和子节点列表可以从DB中提取而不是硬编码。有关如何将已知内容与自由文本进行匹配的具体细节取决于您。

答案 1 :(得分:0)

在wich结构中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'之类的内容 在这种情况下,您有一个DB-search

的唯一名称

我希望我理解你