2009-09-21 101 views
0

我終於想出了一個很好的/簡單的方法,用下面這種格式在我的網站上用正則表達式製作乾淨的URL,但是它需要一個非常大的.htaccess文件,我從這裏的帖子知道它應該不是在使用mod_rewrite時性能不好,但我從來沒有真正看到它在我的方式中使用,幾乎每個頁面都有一個單獨的條目。有沒有更好的方法來做這個正則表達式?

下面是一個入門的一個例子,有一個1頁第2項,第一個條目重新寫入

http://www.example.com/users/online/friends/

http://www.example.com/index.php?p=users.online.friends

它的偉大工程,但如果用戶不在第一頁,然後有另一件事添加到分頁的URL,我不得不寫另一個條目來重寫,當這種情況發生時,這是正確的方式還是應該以某種方式組合?

RewriteRule ^users/online/friends/*$ ./index.php?p=users.online.friends&s=8 
RewriteRule ^users/online/friends/(\d+)/*$ ./index.php?p=users.online.friends&s=8&page=$1 

第二個會做

http://www.example.com/users/online/friends/22/

http://www.example.com/index.php?p=users.online.friends&page=22

+0

's = 8'是什麼意思?每頁都是獨一無二的嗎? – 2009-09-21 02:38:58

+0

@MizardX yes s = 8只是一個內部菜單的標識符 – JasonDavis 2009-09-21 02:58:26

回答

3

這取決於你認爲什麼是更具可讀性,但這裏的你如何能與一個單一的規則去做。

RewriteRule ^users/online/friends(/(\d+))?/*$ ./index.php?p=users.online.friends&s=8&page=$2 

編輯更忠實於治療原題斜線物: 重寫規則^用戶/網絡/朋友/((\ d +)/ *)$ ./index.php?p=users.online.friends & S = 8 &頁= $ 16

我在這裏」?我只是把「(...)?」圍繞網址的最後部分,使其成爲可選匹配項,並將反向引用更改爲$ 2。

當然,這實際上重寫http://www.domain.com/users/online/friends/爲:

http://www.domain.com/index.php?p=users.online.friends&page=

所以,你的PHP代碼將不得不檢查頁面參數是否非空。

+0

這是完美的,但它給服務器上的500錯誤 – JasonDavis 2009-09-21 03:01:25

+0

對不起,我沒有測試它。可能是因爲*在錯誤的地方......我只是編輯它。 – 2009-09-21 03:05:01

+0

謝謝你的作品 – JasonDavis 2009-09-21 10:14:04

3

是的,這很好。我想他們可以合併成一條規則,但沒有任何需要。

你可能會考慮離開頁面的URL的一部分,因此,而不是:

http://www.domain.com/users/online/friends/22/ 

只是有:

http://www.domain.com/users/online/friends?page=22 

,然後有一個規則是這樣的:

RewriteRule ^users/online/friends/?$ ./index.php?p=users.online.friends&s=8 [L,QSA] 

追加查詢字符串

編輯:有幾種減少重寫規則的方法。

首先,中使用通配符搜索詞,如:

RewriteRule ^users/(\w+)/(\w+)$ /index.php?p=users.$1.$2 [L,QSA] 

將減少相當數量的規則。

其次,如果你傳遞的一切通過的index.php只考慮委派所有的請求有:

RewriteRule ^(users/*)$ /index.php/$1 [L,QSA] 

這條規則採用的是第三種方法:不是通過查詢字符串參數傳遞的路徑信息,通過額外的路徑信息傳遞它。可以通過$_SERVER['PATH_INFO']訪問。

這就是說,很多規則不一定是壞的。至少它明確表達了你的所有行爲。然而,你必須警惕的是創造一個維護噩夢。

+0

謝謝,你認爲可以有一個巨大的htaccess文件,我可能會有大約120個這樣的重寫速度?s = 8只是我過去用來貶低哪個「在線」頁面的原始祖先方法,用於突出顯示部分菜單,例如我在用戶部分中有在線用戶,在線朋友,在線女孩,在線男孩等等。我會通過類似s = 8的東西來突出顯示菜單,以顯示我在在線用戶部分的在線朋友頁面,但我不知道2年前設計此部分的最佳方式,但這是一個快速修復 – JasonDavis 2009-09-21 02:42:16

+0

如果它變得太慢,你可以看看mod_rewrite的RewriteMap。它可以使用文件中的散列表來映射URL。或者您編寫的外部程序。 – 2009-09-21 06:54:25

2
# Initial step 
RewriteCond %{QUERY_STRING} !(?:^|&)p= 
RewriteRule ^([^/]+)/(.+) /$2?p=$1 [QSA] 

# Subsequent steps 
RewriteCond %{QUERY_STRING} ((?:[^&]*&)*?)p=([^&]*)(.*) 
RewriteRule ^([^/]+)/(.+) /$2?%1p=%2.$1%3 

# Last step with page number 
RewriteRule ^(\d+)/?$ /index.php?page=$1 [QSA,L] 

# Last step without page number 
RewriteCond %{QUERY_STRING} (?:((?:[^&]*&)*?)p=([^&]*))?(.*) 
RewriteRule ^([^/]+)/?$ /index.php?%1p=%2.$1%3 [L] 

這將重寫URL中的幾個步驟:

  1. http://www.domain.com/users/online/friends/22/
  2. http://www.domain.com/online/friends/22/?p=users
  3. http://www.domain.com/friends/22/?p=users.online
  4. http://www.domain.com/22/?p=users.online.friends
  5. http://www.domain.com/index.php?p=users.online.friends&page=22

一個更簡單的方法是下面的,但需要你改變你的腳本:

RewriteRule ^(.*?)(?:/(\d+))?/?$ /index.php?p=$1&page=$2 [QSA,L] 

這將盡一切一步到位,有一點區別:

  1. http://www.domain.com/users/online/friends/22/
  2. http://www.domain.com/index.php?p=users/online/friends&page=22

添加s=8查詢參數需要更多的工作:

  1. 使用每個頁面的菜單號創建一個文本文件。
  2. 添加RewriteMap指令。
  3. 將倒數第二條規則更改爲使用與最後一條規則相同的RewriteCond
  4. &s=%{menumap:%2|0}添加到最後兩條規則。
相關問題