簡體   English   中英

apache mod_rewrite適用於任何可能性的規則

[英]apache mod_rewrite one rule for any number of possibilities

我正在建立一個相當大的網站,我的.htaccess開始感覺有點膨脹,有沒有辦法取代我現有的系統 - 每個可能通過的可能數量的變量的一個規則,一個捕獲所有可以解釋不同數量輸入的表達式?

例如,我目前有:

RewriteRule ^([a-z]+)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /index.php?mode=$1&id=$2&$3=$4&$5=$6
RewriteRule ^([a-z]+)/([^/]*)/([^/]*)/([^/]*)$ /index.php?mode=$1&id=$2&$3=$4
RewriteRule ^([a-z]+)/([^/]*)$ /index.php?mode=$1&id=$2
RewriteRule ^([a-z]+)$ /index.php?mode=$1

第一個反向引用始終是模式,並且(如果存在的話)第二個反向引用總是id ,此后任何進一步的反向引用在輸入名稱和它的值之間交替

http://www.example.com/search
http://www.example.com/search/3039/sort_by/name_asc/page/23

我希望能夠有一個表達式來優雅地處理所有輸入。

像Drupal一樣:

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

然后使用像這樣的PHP代碼處理腳本中的所有內容

$pathmap = ();
if ($_GET["q"]){
    $path = split("/", $_GET["q"]);
    for ($i=0; $i+1<count($path); $i++){
        $pathmap[$path[$i]] = $path[$i+1];
        $i++;
    }
}

我不知道是否可以使用單個表達式完成,但無論查詢字符串有多長,都可以使用固定數量的表達式完成。

您的mod_rewrite規則將被重復調用,為您提供有時稱為mod_rewrite遞歸的內容。 有避免它的技術,但我認為你想使用它。

設置一個規則,用name = value&替換最后一對

繼續將輸入查詢字符串添加到輸出。 每次通過,您的查詢字符串將變得更長,您的URL將變得更短。

最終,您只有一個與上一個規則匹配的值。

您必須使用捕獲查詢字符串

RewriteCond %{QUERY_STRING} ^(.*)$

然后使用%1將其添加回輸出

你最終會得到四條線。

我知道您開始使用四行,但您可以根據需要匹配任意數量的參數,而無需添加第五行。

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*/)([^/]+)/([^/]+) $1?$2=$3&%1 [L]
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^([^/]+)/ $1.php?%1 [L]

這將重寫以下內容

/mypage/param1/val1/param2/val2/param3/val3/...     --->
/mypage.php?param1=val1&param2=val2&param3=val3&...

當只剩下一個參數時停止。 它將采用第一個“參數”並使用該名稱調用.php文件。 param / val對的數量沒有限制。

我不相信他們是一種方式 - 但我會說你最好的選擇是讓腳本“index.php”處理一個路徑,而不是必須做這么多的反向引用。

例如,你的重寫就是

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

或類似...這將使$ _SERVER ['REQUEST_URI']變量包含路徑信息,您可以拆分並解析。

$path = split('/', $_SERVER['REQUEST_URI']);
array_shift($path); // We always have a first null value
$mode = array_shift($path);

這最終會得到包含模式的$ mode,以及包含路徑其余部分的元素數組的$ path,所以

http://example.com/foo/bar/baz

會讓你的$模式為'foo'而$ path是一個包含'bar'和'baz'的數組

暫無
暫無

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

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