2012-12-04 89 views
1

我剛在這裏環顧了幾個小時,但並未真正找到解決方案。用多個參數重寫url PHP Apache

我目前有典型的查詢字符串像;

http://www.site/jobs/results.php?keyword=Accounting+%26+Finance&type=10&state_id=130&location=NSW&order=1&page=1 

這我還想重寫

http://www.site/jobs/find/accounting-finance/NSW/free-jobs/1/?order=1 

,但我不知道PARAMS將發送的內容,這將取決於用戶做什麼,過濾,分類,訂單等

我想保持簡單並在PHP中解析URL並使用簡單的重寫規則,但是然後我需要鍵/值對,因此我知道哪個值屬於哪個參數類似;

http://www.site/jobs/find/keyword/accounting-finance/state/NSW/type/free-jobs/page/1/?order=1 

我被告知這不是seo的好選擇。

除了在.htacces寫很多不同的規則來覆蓋所有的場景,你可以提出一個更好的方式來處理這個

感謝

回答

1

的.htaccess:

RewriteEngine on 
# skip rewriting if file/dir exists (optionally) 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
# rewrite all to results.php 
RewriteRule . results.php 

PHP(與關鍵=>值對簡單的方法):

// current URI (/jobs/find/keyword/accounting-finance/state/NSW/type/free-jobs/page/1/?order=1) 
$path = $_SERVER['REQUEST_URI']; 

// remove base path (/jobs) 
if (($len = strlen(basename($_SERVER['SCRIPT_FILENAME'])))) 
    $path = substr($len, $path); 

// remove GET params (?order=1) 
if (false !== ($pos = strpos($path, '?'))) 
    $path = substr($path, 0, $pos); 

$path = explode('/', trim($path, '/')); 

// extract action (or whatever 'find' is) 
$action = array_shift($path); 

// make key => value pairs from the rest 
$params = array(); 
for ($i = 1, $c = count($path) ; $i < $c ; $i += 2) { 
    $params[urldecode($path[$i - 1])] = urldecode($params[$i]); 
    // or put it to GET (only remember that it will overwrite already existing values) 
    //$_GET[urldecode($path[$i - 1])] = urldecode($params[$i]); 
} 

可以修改此腳本只,無按鍵來實現價值,但這裏來這個問題 - 是否有可能確定價值應該是一個關鍵還是另一個關鍵?如果PARAMS總是在相同的位置,你只能得到更少或更多的人,那麼它很容易:

// skip this step from previous example 
//$action = array_shift($path);  

$params = array(
    'action' => null, 
    'keyword' => null, 
    'state' => null, 
    'type' => null, 
    'page' => null, 
); 
$keys = array_keys($params); 
for ($i = 0 , $c = min(count($path), count($keys) ; $i < $c ; ++$i) { 
    $params[$keys[$i]] = urldecode($path[$i]); 
} 

但是,如果你不知道哪個參數是在哪個位置,然後事情會更復雜。你需要做的每PARAM一些檢查並確定它是哪一個 - 如果所有的值都是從價值觀的一些已知的列表中選擇那麼它也不會是很困難的,例如:

$params = array(
    'action' => null, 
    'keyword' => null, 
    'state' => null, 
    'type' => null, 
    'page' => null, 
); 
$params['action'] = array_shift($path); 
$keys = array_keys($params); 
foreach ($path as $value) { 
    if (is_numeric($value)) $params['page'] = intVal($value); 
    else { 
     $key = null; 
     // that switch is not very nice - because of hardcode 
     // but is much faster than using 'in_array' or something similar 
     // anyway it can be done in many many ways 
     switch ($value) { 
      case 'accounting-finance' : 
      case 'keyword2' : 
      case 'keyword3' : 
       $key = 'keyword'; 
       break; 
      case 'NSW' : 
      case 'state2' : 
       $key = 'state'; 
       break; 
      case 'type1' : 
      case 'type2' : 
      case 'type3' : 
       $key = 'type'; 
       break; 
      // and so on... 
     } 
     if ($key === null) throw new Exception('Unknown value!'); 
     $params[$key] = $value; 
    } 
} 

你也可以嘗試在.htaccess中寫一些非常複雜的正則表達式,但IMO不是這樣的地方--apache應該在你的應用程序中使用正確的端點匹配請求並運行它,而不是擴展參數邏輯的地方(如果它總是會的話去你的應用程序中的相同位置)。在應用程序中保持邏輯更方便 - 當你改變某些東西時,你可以在應用程序代碼中做到這一點,而不需要在htaccess或apache配置中更改任何東西(在生產環境中,我主要將.htaccess內容移動到apache配置並關閉。htaccess支持 - 當apache不搜索這些文件時會提供一些加速,但任何更改都需要apache重新啓動)。

+1

這是想法,但如何做到這一點沒有鍵/值對?我真的想要找到/價值/價值/價值/例如find/accounting-finance/NSW/free-jobs/1/ – gus

+0

我認爲答案是使用重寫將參數轉換爲url並通過發送原始查詢字符串值GET解析。我將不得不爲每個參數寫一條規則,但那沒關係。 – gus

+0

我寧願將它傳遞給PHP並在那裏解析。在$ action = array_shift($ path)之後;''''''''''''''''''''''''''''''''''''''''''''''沒有鑰匙)。其他的選擇是爲整個路徑編寫一些正則表達式規則(在爆炸之前)並以這種方式進行。 – lupatus

0

如果你想要做的是什麼推SEO相關的進URL,你居然改寫變得非常簡單:只需不做任何重寫可言,保持他們在哪裏的參數,只需填寫了現場results.php與你的SEO關鍵字後:

http://myurl/jobs/results.php/seo-keywords/gohere/as-you-like-it?keyword=Accounting+%26+Finance&type=10&state_id=130&location=NSW&order=1&page=1 

它不應該做differenc因爲這條不友好的路徑最終被解析爲$ _SERVER ['PATH_INFO'],但腳本執行保持不變。

問題是:什麼是您的SEO相關的關鍵字的來源? :)

+0

這是一個選項,但不是什麼後即時通訊。 – gus