2010-12-14 49 views
8

我正在向網站上的人員發佈網址,這些網址實際上指向了一些醜陋的東西(在同一網站上)。可以使用非常長的.htaccess文件嗎?

http://www.mydomain.com/cool-URL
實際上指向
http://www.mydomain.com/boring.php?id=478547&sessid=34734asdf7&otherboringdetails

我打算通過在需要時修改.htaccess文件來實現這一目標。我將把PHP腳本寫入.htaccess文件,每當有新的url傳出時(從非程序員可以控制的管理區域添加新的重寫規則)[爲此指定URL標題新條目,管理員:它將被自動分配])。

這會是一個問題,特別是在1000左右這樣的URL後?實際可接受的數字是多少?因爲,我可以這樣描述:服務器接收到一個URL請求,然後在.htaccess文件中爲該URL尋找正確的頁面,最後將用戶發送到正確的頁面。如果這是類似於數據庫搜索的任何事情,則用戶實際上可能需要很長時間才能到達正確的頁面...

有關於此的任何指針嗎?

+0

我有興趣。 – Trufa 2010-12-14 03:02:46

回答

18

不,它不好,會妨礙你的頁面加載速度。

.htaccess文件在每個服務器請求上進行評估。即使是靜態圖像,CSS和JS文件。所以,你要求Web服務器在執行請求時解析1000多條可能的REGEX行。

此外,父目錄的.htaccess文件也處理駐留在子目錄中的文件。因此,如果您的大型.htaccess位於網站的根目錄中,那麼它也將在子目錄中針對所有文件請求(以及子目錄中的.htaccess文件)進行處理。

那我的朋友是很多處理。如果您有一個包含10個圖像的頁面(例如),它會獲得11次處理。而文件中的處理越多,則需要的循環越多。所以,是的,任何在htaccess文件中都有影響。現在的影響是否顯着?很難說什麼時候它成爲一個問題。但它會相當大,因爲處理相對簡單,在你的情況下。

帶有htaccess文件的關鍵是讓它變得聰明。你不想列出200個條目。只需幾行(如果你想使用htaccess的話),你就可以做到這一點。

+0

好的,我會研究爲我的問題做出正確的正則表達式。感謝您的澄清:) – 2010-12-14 08:43:44

1

應該沒問題。當它變得很長時,你可能會遇到服務器延遲。我會研究mod_rewrite規範,你可以用幾行&正則表達式函數來自動化轉發。我不太瞭解將傳遞給您的示例的url變量。

5

我會執行一個簡單的測試:用隨機的URL生成一個大的.htaccess文件,然後自己測量結果的性能。

import random,string 

def rand_string(): 
    length = random.randint(4,10) 
    res = [] 
    for i in range(length): 
     res.append(random.choice(string.letters)) 
    return ''.join(res) 

for i in range(1000): 
    print "RewriteRule %s http://www.mydomain.com/boring.php?%s [R]" % \ 
    (rand_string(), rand_string()) 
4

有這麼多的規則是不可取的。這並不是說它們在.htaccess文件中,或者它們是針對每個請求進行測試的。 (根據配置的不同,如果將它們放入服務器或虛擬主機配置中,也可能會發生這種情況。)

事實上,這是大量的規則經過測試,並且根據規則,每條規則必須經過測試,直到找到一場比賽。那麼,你可以通過按照匹配概率的順序排列規則來抵消這種情況,以便儘早找到匹配的概率很高。但在最壞的情況下,它的複雜性仍然是O(n)。

如果您確實需要更多的映射並且映射是固定的,那麼可以使用RewriteMap hash file,其複雜度爲O(1)而不是O(n)。或者您將映射移至您的PHP應用程序並在那裏執行。

+0

哇大提示和感謝鏈接! – 2010-12-14 08:44:49

1

這絕對不行,因爲這裏有幾個人提到過。

您是否知道所有您希望事先重寫的URL。如果是這樣,您可以將規則存儲在某個數據庫中,通過規則進行迭代並預先生成實際的URL,並將它們存儲在內存緩存中,其中鍵爲外觀良好的URL,值爲內容的實際URL。

然後,當請求到來時,查找memcache中的密鑰,並將用戶重定向到真實URL。我甚至不認爲你需要這個.htaccess。

相關問題