[英]PHP + HTACCESS + mod_rewrite + different length url segments
對,大家下午好(嗯,今天是英國的下午!)
我正在編寫一個使用友好URL的(PHP / MySQL)網站。
我已經設置了htaccess(啟用了mod_rewrite),並且有一個可以處理“ /”的基本腳本,然后其他所有事情都在“?”之后進行了處理。 在同一腳本中。 即我能夠制定出一個用戶是否試圖把example.com/about
, example.com/about/the-team
或example.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-title)
example.com/news/article/new-article
(節點+子節點+ seo-title)
example.com/join/?hash=abc123etc&this=that
(節點+查詢對)
但是,“節點”(第一個參數),“子節點”(第二個參數)或“ seo友好頁面標題”可能丟失或未知(數據庫控制),因此我無法將處理專門放在.htaccess中。 記住:我(我認為!)已經有了一個有效的htaccess,可以將所有內容正確轉發到我的PHP處理腳本中。 找不到的所有內容都將轉發到CMS“ 404”。
我認為我的客戶最多可以有三個參數(然后其他所有參數都在“?”之后)。
是否有人嘗試過這種方法,或者是否有地方從數據庫結構開始,或者如何處理我是否提出了上述任何可能性?
我在上一個項目中嘗試過,但始終不得不編寫CMS來強制用戶(至少要添加頁面)至少擁有一個節點或一個節點+子節點+ seo-title,而我想擺脫這個標題從...
我不希望通過嘗試找到參數的每種可能性直到找到匹配項的腳本對數據庫搜索造成太大壓力...或者這是我要實現我所要問的唯一方法?
非常感謝!
您可以像這樣滿足不同數量的比賽:
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;
}
顯然,可以從數據庫中提取節點和子節點的列表,而不必進行硬編碼。 如何將已知內容與自由文本進行匹配的確切細節完全取決於您。
在三明治結構的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'
類'news_article_new-article'
在這種情況下,您為數據庫搜索使用唯一的名稱
我希望我理解你對
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.