Apache-2.4

如果找不到 REQUEST_URI,如何排除 RewriteMap

  • November 26, 2018

我有一個舊網站 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。

如果 urlexample.com/abc12345.htm查看abcredirects.dbmelse 退出到 VirtualHost

如果 urlexample.com/xyz12345.htm查看xyzredirects.dbmelse 退出到 VirtualHost

如果網址example.com/abc12345.htm不要查看xyzredirects.dbm

如果網址example.com/xyz12345.htm不要查看abcredirects.dbm

如果 urlexample.com/hik12345.htm不要查看xyzredirects.dbmabcredirects.dbm

NO .htaccess 不幸的是我不能使用 .htaccess

Apache If 語句不起作用

認為延遲不在RewriteMap定義中,只是在第一次呼叫查找時。所以RewriteMaps 可以在配置的頂部定義。

似乎不需要使用<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.htmexample.com/abc12345.htmexample.com/dir/dir/abc12345.xmlexample.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]

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