Mod-Rewrite

這些 Apache vhost 重寫效率高嗎?

  • March 15, 2019

我們的電子商務系統有大約 300 - 500 毫秒的 TTFB,我認為這一點也不差,但仍然不如靜態文件。本週我終於嘗試創建自己的產品/類別頁面的本地記憶體,並告訴我們的伺服器在可用時重寫這些文件,否則重寫到電子商務系統。

它工作得很好,我們的 TTFB 現在通常在 50 - 100 毫秒左右。我還觀察了我們的伺服器平均負載top,在大多數情況下,這個數字從大約 0.5 下降到 0.2ish(由於流量偶爾會有一些跳躍)。因此,總的來說,這似乎使伺服器執行更順暢,並加快了頁面載入時間,這正是我所希望的。

話雖如此,我不是重寫和伺服器性能方面的專家 - 任何人都可以快速回顧一下,讓我知道是否有改進的餘地嗎?這些重寫位於 vhost 文件中。

# product pages
RewriteCond %{REQUEST_URI} ^/product_([^.]+).*$
RewriteCond %{DOCUMENT_ROOT}\/\local_http_cache\/product_%1.php -f
RewriteRule (.*) /local_http_cache/product_%1.php?CacheFlag [PT,QSA,L]
RewriteRule ^/product_([^.]+).*$ /path/to/OurEcommerceSystem?ProductID=$1 [PT,QSA]

# category pages
RewriteCond %{REQUEST_URI} ^/category_([^.]+).*$
RewriteCond %{QUERY_STRING} !((^|&)(Sort_By|Per_Page)=(.*)+(&|$))
RewriteCond %{DOCUMENT_ROOT}\/\local_http_cache\/category_%1.php -f
RewriteRule (.*) /local_http_cache/category_%1.php?CacheFlag [PT,QSA,L]
RewriteRule ^/category_([^.]+).*$ /path/to/OurEcommerceSystem?CategoryID=$1 [PT,QSA]

其他幾點注意事項:

  • 對於產品和類別頁面,主要目標是相同的:檢查此產品/類別 ID 是否存在記憶體文件。如果是,則提供它,否則什麼也不做,讓下一次重寫將請求發送到我們的電子商務系統。
  • ?CacheFlag沒有做任何特別有用的事情 - 但是 .htaccess 文件中的一條規則告訴/local_http_cache/它禁止任何沒有該標誌的東西,所以沒有人可以直接瀏覽這些文件
  • 由於一些檢查會話 ID 的程式碼,記憶體頁面是特意使用 PHP 的,但我將考慮消除它,這將允許我只記憶體靜態 html 程式碼。
RewriteCond %{REQUEST_URI} ^/product_([^.]+).*$
RewriteCond %{DOCUMENT_ROOT}\/\local_http_cache\/product_%1.php -f
RewriteRule (.*) /local_http_cache/product_%1.php?CacheFlag [PT,QSA,L]

您不需要檢查REQUEST_URI. 這個檢查應該在RewriteRule 模式(.*)中執行(就像你對後面的指令所做的那樣)——而不是RewriteRule. (如果您這樣做,您自然需要將反向引用從更改為%1-見下文)$1

首先處理RewriteRule 圖案。只有當這個匹配是前面的條件被處理時,所以通過在這裡匹配所有模式,你正在強制處理RewriteCond指令。

^/product_([^.]+).*$

尾隨.*$是多餘的。這只是強制正則表達式解析器吞噬URL 路徑的其餘部分,無論如何您似乎都不感興趣。

但是,這也看起來有點太籠統了?我假設您沒有任何具有開頭 URL 路徑的靜態資源(JS、CSS 或圖像等)/product_?如果你這樣做了,那麼這個模式應該更加嚴格,否則它最終會“測試”比它需要的更多的請求。

RewriteCond %{DOCUMENT_ROOT}\/\local_http_cache\/product_%1.php -f

您不需要使用反斜杠轉義TestStringl中的斜杠或 (?) 。這不是正則表達式,但即使是這些字元也沒有特殊含義。

/local_http_cache/product_%1.php?CacheFlag [PT,QSA,L]

您是否需要PT此處的標誌(或任何這些指令)?這導致替換字元串被視為 URL 路徑,並且重寫過程重新開始。如果您直接重寫到不需要進一步處理的文件PT(假定在 vHost 上下文中),則可以省略該標誌。

在這種情況下,我也會質疑CacheFlag查詢字元串的使用。您可以將其更改為環境變數(例如E=UniqueCacheFlag:1在標誌中)並在目錄RewriteRule中檢查它(例如- 假設 Apache 2.4)。在這種情況下也可以省略該標誌。這也將使直接訪問“不可能”。/local_http_cache Require env UniqueCacheFlag``QSA

?CacheFlag沒有做任何特別有用的事情 - 但 ’s 文件中的一條規則告訴/local_http_cache/.htaccess禁止任何沒有該標誌的東西

由於效率是這裡的問題……你為什麼要使用.htaccess?特別是因為您在 vHost 中有其他指令。這不僅僅是有一個.htaccess文件的事實 - 而是它們可以開始使用(Apache 將搜尋它們)。文件中的指令/local_http_cache/.htaccess應移動到<Directory>vHost 中的適當部分,並AllowOverride None應為文件根目錄設置,以禁用.htaccess文件。

RewriteRule ^/product_([^.]+).*$ /path/to/OurEcommerceSystem?ProductID=$1 [PT,QSA]

您不應該L在這裡設置一個標誌以防止進一步處理嗎?

所以,總而言之,我們有:

# product pages
RewriteCond %{DOCUMENT_ROOT}/local_http_cache/product_$1.php -f
RewriteRule ^/product_([^.]+) /local_http_cache/product_$1.php [E=UniqueCacheFlag:1,L]
RewriteRule ^/product_([^.]+) /path/to/OurEcommerceSystem?ProductID=$1 [QSA,L]

這同樣適用於該# category pages塊。

引用自:https://serverfault.com/questions/958516