2013-07-02 96 views
0

不知道是否有合理的方法來做到這一點,或者如果我錯過了某些東西。我建立了一個內容管理系統,它通過一個模板系統(基本上是一個處理單個PHP文件)傳遞所有內容。考慮到這一點,下面的規則將請求發送到lucy.php,其中url被驗證並且加載了適當的模板。Mod重寫規則以追加查詢字符串並繼續

RewriteRule ^$ lucy.php [L,QSA] 
RewriteRule ^([^/\.]+)/?$ lucy.php?section1=$1 [L,QSA] 
RewriteRule ^([^/\.]+)/([^/\.]+)/?$ lucy.php?section1=$1&section2=$2 [L,QSA] 
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ lucy.php?section1=$1&section2=$2&section3=$3 [L,QSA] 

因此,URL的每個部分都以段#變量的形式發送到腳本。我的問題是當我使用需要自己的URL系統的模板。在這種情況下......一個博客。通常情況下,我會做類似

RewriteRule ^blog/([0-9]{4})/([0-9]{2})/([0-9]{2})/([^/\.]+)/?$ site/blog.php?year=$1&month=$2&day=$3&blog_url=$4 [L,QSA] 

將請求發送到一次性腳本。我現在的做法是,http://domain.com/blog仍然會通過上述lucy.php腳本加載和顯示博客模板。那麼,是否可以繼續允許將請求的/ blog部分路由到適當的重寫規則,但是還要將年,月,日和blog_url字段附加到查詢字符串?/blog的url不會一致,甚至可能不會被稱爲博客,所以我需要一些可以動態工作的東西。

我唯一的想法是重複lucy.php的每個實例重寫,以包含基於日期的結構的可選參數。像...

RewriteRule ^([^/\.]+)/([0-9]{4})/([0-9]{2})/([0-9]{2})/([^/\.]+)/?$ lucy.php?section1=$1&year=$2&month=$3&day=$4&item_url=$5 [L,QSA] 

但我認爲可能有更有效的方式來做到這一點。該慣例的另一個問題是,我希望這可以用於其他場景,如類別,作者和其他非博客場景。我不想爲這些實例中的每一個重複重寫lucy.php塊。思考?

回答

1

傳遞完整的URL,然後解析它在PHP,而不是寫出新的規則

RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ /lucy.php?url=$1 [QSA,L] 

編輯:

在PHP我用這個...

function parseUrl(){ 

    $tempArray = explode('/', $_GET['url']); 

    foreach($tempArray as $section){ 
     if(stristr($section,':')){ 
      $tempParamArray = explode(':',$section); 
      if(stristr($tempParamArray[1],',')){ 
       $tempParamArray[1] = explode(',',$tempParamArray[1]); 
      } 
      $this->parameters[$tempParamArray[0]] = $tempParamArray[1]; 
     }else{ 
      if(!empty($section)){     
       array_push($this->sections,$section); 
      } 
     } 
    } 

} 

然後我使用URLS ...

/section1/section2/section3/

/博客/日期:01-01-2013/

+0

這絕對是一種選擇,但我只是希望作爲最後的手段實施。就像我不想用大量重複代碼填充.htaccess一樣,我也不想在PHP中做同樣的事情。 –

+0

@KorySharp'我不需要...包含/需要或功能的大型重複代碼塊。使用php解析'$ _SERVER ['REQUEST_URI']'(或例子中的$ _GET ['url']')提供了更多的靈活性。你最好把代碼分解成更小的文件,然後根據請求的uri包含它們。 –

+0

@JohnathanKuhn我不是從組織角度講的。我知道如何使用include來分組代碼。我試圖找出最有效的方法來做某些事情,而且我不想通過使用PHP自己的url解析來重新發明輪子。 –