如果找不到 REQUEST_URI,如何排除 RewriteMap
我有一個舊網站 wordpress 網站,我正在遷移。
大約有 50000 個 URL 需要重定向。
為此,我正在使用似乎工作正常的 DBM 文件,但是在負載測試期間,我注意到每個請求都損失了大約 0.5 秒。
查看日誌,看起來每次都有 50000 的 DBM 文件被命中。
我將 DBM 從 50000 更改為 10000,並註意到來自 50000 DBM 文件的每個請求我獲得了大約 0.25 秒。
我希望能夠做這樣的事情,但是無論我如何混合和匹配程式碼,我都無法讓它工作:
<If "%{REQUEST_URI} =~ m#^abc#"> RewriteMap abcredirects "dbm:/etc/httpd/conf/dbm/abcredirects.dbm" <IfModule mod_rewrite.c> RewriteEngine On RewriteCond ${abcredirects:$1} !="" RewriteRule ^(.*) /${abcredirects:$1} [R=301,L] </IfModule> </If> <If "%{REQUEST_URI} =~ m#^xyz#"> RewriteMap xyzredirects "dbm:/etc/httpd/conf/dbm/xyzredirects.dbm" <IfModule mod_rewrite.c> RewriteEngine On RewriteCond ${xyzredirects:$1} !="" RewriteRule ^(.*) /${xyzredirects:$1} [R=301,L] </IfModule> </If>
使用上面的 sudo 程式碼我怎樣才能讓它工作?
IE。
如果 url
example.com/abc12345.htm
查看abcredirects.dbm
else 退出到 VirtualHost如果 url
example.com/xyz12345.htm
查看xyzredirects.dbm
else 退出到 VirtualHost如果網址
example.com/abc12345.htm
不要查看xyzredirects.dbm
如果網址
example.com/xyz12345.htm
不要查看abcredirects.dbm
如果 url
example.com/hik12345.htm
不要查看xyzredirects.dbm
或abcredirects.dbm
NO .htaccess 不幸的是我不能使用 .htaccess
我認為延遲不在
RewriteMap
定義中,只是在第一次呼叫查找時。所以RewriteMap
s 可以在配置的頂部定義。似乎不需要使用
<If>
條件,因為您可以(並且應該)檢查RewriteRule
pattern中的 URL-path 。在 vHost 中嘗試以下操作:
RewriteEngine On RewriteMap abcredirects "dbm:/etc/httpd/conf/dbm/abcredirects.dbm" RewriteMap xyzredirects "dbm:/etc/httpd/conf/dbm/xyzredirects.dbm" RewriteCond ${abcredirects:$1} !="" RewriteRule ^(/abc.*) /${abcredirects:$1} [R=301,L] RewriteCond ${xyzredirects:$1} !="" RewriteRule ^(/xyz.*) /${xyzredirects:$1} [R=301,L]
不需要
<IfModule>
容器(除非您的網站打算在沒有 mod_rewrite 的情況下工作 - 但情況可能並非如此)。首先處理
RewriteRule
圖案。如果失敗,則跳過前面的條件(查找重寫映射)並繼續處理下一個RewriteRule
。如果
/abc12345.htm
字面上由數字組成,後跟.htm
副檔名,則將其包含在RewriteRule
正則表達式中以盡可能具體並防止不必要的查找。例如:RewriteRule ^(/xyz\d+\.htm)$ /${xyzredirects:$1} [R=301,L]
測試前請確保您的瀏覽器記憶體已清除。出於這個原因,使用 302(臨時)重定向通常更容易測試。
但是,如果這一切都發生在新網站/伺服器上,那麼上述方法可能不是最好的方法,因為它會影響每個請求,包括對新頁面和靜態資源的所有請求。
對於這麼多 URL,當您的站點已經確定它是 404 時,通常最好編寫重定向腳本。只有在請求的這個後期階段,您才應該在站點的數據庫中查找新 URL 並觸發重定向。這樣它就不會影響“正常”的網站性能。
更新:
abc url 可以是幾種不同的方式,
example.com/dir/dir/abc12345.htm
或example.com/abc12345.htm
或example.com/dir/dir/abc12345.xml
,example.com/dir/abc12345.xml
。URL 中唯一的常量是abc
.在這種情況下,將
RewriteRule
模式從更改為^(/abc.*)
:RewriteRule (.*/abc.+\.(?:htm|xml))$ /${abcredirects:$1} [R=301,L]
如上所述,如果文件基名的其餘部分(在文件副檔名之前)總是由數字(0-9)組成,那麼更具體,匹配
\d
而不是.
. 或者,如果總是有 5 位數字(如您的範例中所示),則\d{5}
.請注意,上面擷取了匹配的整個 URL 路徑(例如。
/dir/dir/abc12345.htm
),然後將其作為參數傳遞給您的重寫映射。RewriteRule (.*/abc\d+\.(?:htm|xml))$ /${abcredirects:$1} [R=301,L]