基於目錄匹配的 Apache 重定向 & 向目標 URL 添加另一個字母
所以這就是我想要完成的。我有這個連結,我想 301 重定向:
來源網址:
<https://www.example.com/>**folder1**/page.aspx?fh_location=%2f%2fpackages%2fnl_BE%2fpr_earlybookable%3E%7b0%7d%2fpk_active%3d1%2fpk_siteswitch%3E%7bnvb%7d%2fpk_country%3E%7biso_pt%7d%2fpk_city%3E%7bgeo_9833%7d%2fpr_duration%3E%7b0608%7d%2fpk_hotelonly%3d0&fh_sort_by=pr_defaultprice&**fh_secondid=nbs_city_cli16a_s18**&fh_view=detail&fh_eds=%C3%9F&RoomOccupation1=CLI16A_2a_LO_2_0
**條件 1:**我有一個目錄列表,例如
folder1
,folder2
,folder3
,folder4
。我只想在 URL 包含上面列出的任何文件夾時重定向,但不包含 URL 中folder5
未在上面列出的任何其他文件夾。**條件2:**現在是棘手的部分;在目標中,它應該
cli16a
從 URL中獲取 idfh_secondid=nbs_city_cli16a_s18
,然後附加到目標 URL,如下所示
<https://www.example.com/be/_CLI16A>**Y**/
**條件3:**現在是最棘手的部分。將其添加
Y
到目標 URL,它表示源 URL 中的文件夾,例如folder1
=Y
、folder2
=O
、folder3
=B
、folder4
=C
。到目前為止,我已經想出了以下內容。
RewriteMap WE NEED TO GET A MAPPING OF TYPE OF HOTEL (not sure what to put here) RewriteCond %{REQUEST_URI} ==(folder1|folder2|folder3|folder4) [NC] RewriteCond ${conv-lc:%{QUERY_STRING}} (fh_secondid)=[^_]+_[^_]+_([^_]+)_ RewriteRule ^/nl/_USE RewriteMap Matching text here/ ( not sure what to put here)
聽起來,您不一定需要a
RewriteMap
,只要目錄的數量是有限的,它們似乎是,並且目標 URL 中的 ID 不區分大小寫,您說不是(在評論中) .對於 ID後綴(“Y”、“O”、“B”或“C”),我們可以根據請求的目錄創建一個環境變數:
RewriteEngine On # Assign value to ID_SUFFIX based on the directory being accessed RewriteRule ^/?folder1 - [E=ID_SUFFIX:Y] RewriteRule ^/?folder2 - [E=ID_SUFFIX:O] RewriteRule ^/?folder3 - [E=ID_SUFFIX:B] RewriteRule ^/?folder4 - [E=ID_SUFFIX:C]
然後,僅在
ID_SUFFIX
設置了 env var 的情況下進一步處理請求,從查詢字元串中擷取所需的 ID:# Capture ID and redirect RewriteCond %{ENV:ID_SUFFIX} . REwriteCond %{QUERY_STRING} fh_secondid=[^_]+_[^_]+_([^_]+) RewriteRule ^ /be/_%1%{ENV:ID_SUFFIX}/ [R=302,L]
該表達式
%{ENV:ID_SUFFIX}
自然是指較早設置的 env var(如果有的話)。最初,我們只是檢查它是否已設置(即包含某些內容)-僅當已請求命名目錄之一時才設置它。
%1
是對最後匹配的CondPattern中第一個擷取的組的反向引用。IE。這包含 ID(例如cli16a
在您的範例中)。然後,這會構造表單的替換
/be/_cli16aY/
並發出外部重定向。請注意,這目前是 302(臨時)重定向。僅當您確定它工作正常時才將其更改為 301(永久),以避免潛在的記憶體問題。