PHP + HTACCESS + mod_rewrite + different length url segments

空扰寡人 提交于 2019-12-06 10:11:28

问题


Right, Good afternoon all (well, it is afternoon here in the UK!)

I am in the process of writing a (PHP/MySQL) site that uses friendly URLs.

I have set up my htaccess (mod_rewrite enabled) and have a basic script that can handle "/" and then everything else is handled after "?" in the same script. I.e. I am able to work out whether a user has tried to put example.com/about, example.com/about/the-team or example.com/join/?hash=abc123etc etc.

My question is how do I handle variable length URLs such as (examples):

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 (node + query pair)

BUT, the "nodes" (first argument), "sub-nodes" (second argument) or "seo-friendly page titles" may be missing or unknown (database controlled) so I cannot put the processing in .htaccess specifically. Remember: I have already (I think!) got a working htaccess to forwards everything correctly to my PHP processing script. Everything not found will be forwarded to a CMS "404".

I think my client will have a maximum of THREE arguments (and then everything else will be after "?").

Has anyone tried this or have a place to start with a database structure or how to handle whether I have put any of the above possibilities?

I have tried in a previous project but have always had to resort to writing the CMS to force the user to have (whilst adding pages) at least a node OR a node + subnode + seo-friendly-title which I would like to get away from...

I don't want a script that will put too much strain on database searches by trying to find every single possibility of the arguments until a match is found... or is this the only way if I want to implement what I'm asking?

Many Thanks!


回答1:


You can cater for different numbers of matches like this:

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] 

Where [ ^ / ] to matches any character other than '/' - and then because that term was enclosed in () brackets, it can be used in the re-written URL.

QSA would handle all the parameters and correctly attach them to the re-written URL.

How you match up the parts with things that you know about is up to you but I imagine that something like this would be sensible:

$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;
}

Obviously the list of nodes and subNodes could be pulled from a DB rather than being hard-coded. The exact details of how you match up the known things with the free text is really up to you.




回答2:


in wich structure does the php script get the information?

if the structure for 'example.com/news/article/new-article' is

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

you could check if $_GET[c] is empty; if not the real site is $_GET[b], and so one...

an other way is that $_GET[a] will return someting like 'news_article_new-article' in this case you have an unique name for DB-search

I hope I understood you right



来源:https://stackoverflow.com/questions/11208915/php-htaccess-mod-rewrite-different-length-url-segments

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!