簡體   English   中英

用多個參數重寫URL PHP Apache

[英]Rewrite url with multiple params 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

但我不知道會發送什么參數,這取決於用戶的操作,過濾器,類別,訂單等

我想保持它的簡單,並使用PHP解析URL並使用簡單的重寫規則,但是隨后我需要鍵/值對,以便知道哪個值屬於哪個參數;

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

有人告訴我,這不是seo的好選擇。

除了在.htacces中編寫許多不同的規則以涵蓋所有情況之外,您還可以建議一種更好的方法來解決此問題

謝謝

.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(使用key => value對的簡單方法):

// 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]);
}

您可以修改此腳本以僅在沒有鍵的情況下實現值,但這是一個問題-是否可以確定值應該是一個鍵還是另一個鍵? 如果參數始終處於同一位置,而您只能獲得更少或更多的參數,那么這很簡單:

// 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]);
}

但是,如果您不知道哪個參數位於哪個位置,那么事情將會變得更加復雜。 您將需要對每個參數進行一些檢查並確定它是哪一個-如果所有這些值都是從某些已知值列表中選擇的,那么也就不會很困難,例如:

$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 config中的任何內容(在生產環境中,我主要將.htaccess內容移至apache config中並關閉.htaccess支持-當apache不搜索那些文件,但是任何更改都需要重新啟動apache時,可以加快速度。

如果您要做的只是將任何與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

它不會對PHP造成影響,因為該不存在的路徑最終將被解析為$ _SERVER ['PATH_INFO'],但是腳本執行保持不變。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM